Skip to content

Commit 66fb9f9

Browse files
committed
feat: add python and java solutions to leetcode problem: No.0152
1 parent 82fe809 commit 66fb9f9

File tree

6 files changed

+76
-34
lines changed

6 files changed

+76
-34
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@
132132
### 动态规划
133133

134134
- [最大子序和](/solution/0000-0099/0053.Maximum%20Subarray/README.md)
135+
- [乘积最大子序列](/solution/0100-0199/0152.Maximum%20Product%20Subarray/README.md)
135136
- [打家劫舍](/solution/0100-0199/0198.House%20Robber/README.md)
136137
- [打家劫舍 II](/solution/0200-0299/0213.House%20Robber%20II/README.md)
137138
- [最长上升子序列](/solution/0300-0399/0300.Longest%20Increasing%20Subsequence/README.md)

README_EN.md

+1
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ Complete solutions to [LeetCode](https://leetcode-cn.com/problemset/all/), [LCOF
121121
### Dynamic Programming
122122

123123
- [Maximum Subarray](/solution/0000-0099/0053.Maximum%20Subarray/README_EN.md)
124+
- [Maximum Product Subarray](/solution/0100-0199/0152.Maximum%20Product%20Subarray/README_EN.md)
124125
- [House Robber](/solution/0100-0199/0198.House%20Robber/README_EN.md)
125126
- [House Robber II](/solution/0200-0299/0213.House%20Robber%20II/README_EN.md)
126127
- [Longest Increasing Subsequence](/solution/0300-0399/0300.Longest%20Increasing%20Subsequence/README_EN.md)

solution/0100-0199/0152.Maximum Product Subarray/README.md

+34-2
Original file line numberDiff line numberDiff line change
@@ -24,22 +24,54 @@
2424

2525
<!-- 这里可写通用的实现逻辑 -->
2626

27+
考虑当前位置 i:
28+
29+
- 如果是一个负数的话,那么我们希望以它前一个位置结尾的某个段的积也是个负数,这样可以负负得正,并且我们希望这个积尽可能「负得更多」,即尽可能小。
30+
- 如果是一个正数的话,我们更希望以它前一个位置结尾的某个段的积也是个正数,并且希望它尽可能地大。
31+
32+
因此,分别维护 fmax 和 fmin。
33+
34+
- `fmax(i) = max(nums[i], fmax(i - 1) * nums[i], fmin(i - 1) * nums[i])`
35+
- `fmin(i) = min(nums[i], fmax(i - 1) * nums[i], fmin(i - 1) * nums[i])`
36+
- `res = max(fmax(i)), i∈[0, n)`
37+
2738
<!-- tabs:start -->
2839

2940
### **Python3**
3041

3142
<!-- 这里可写当前语言的特殊实现逻辑 -->
3243

3344
```python
34-
45+
class Solution:
46+
def maxProduct(self, nums: List[int]) -> int:
47+
maxf = minf = nums[0]
48+
res, n = nums[0], len(nums)
49+
for i in range(1, n):
50+
p, q = maxf, minf
51+
maxf = max(nums[i], p * nums[i], q * nums[i])
52+
minf = min(nums[i], p * nums[i], q * nums[i])
53+
res = max(res, maxf)
54+
return res
3555
```
3656

3757
### **Java**
3858

3959
<!-- 这里可写当前语言的特殊实现逻辑 -->
4060

4161
```java
42-
62+
class Solution {
63+
public int maxProduct(int[] nums) {
64+
int maxf = nums[0], minf = nums[0];
65+
int res = nums[0], n = nums.length;
66+
for (int i = 1; i < n; ++i) {
67+
int p = maxf, q = minf;
68+
maxf = Math.max(nums[i], Math.max(p * nums[i], q * nums[i]));
69+
minf = Math.min(nums[i], Math.min(p * nums[i], q * nums[i]));
70+
res = Math.max(res, maxf);
71+
}
72+
return res;
73+
}
74+
}
4375
```
4476

4577
### **...**

solution/0100-0199/0152.Maximum Product Subarray/README_EN.md

+23-2
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,34 @@
3535
### **Python3**
3636

3737
```python
38-
38+
class Solution:
39+
def maxProduct(self, nums: List[int]) -> int:
40+
maxf = minf = nums[0]
41+
res, n = nums[0], len(nums)
42+
for i in range(1, n):
43+
p, q = maxf, minf
44+
maxf = max(nums[i], p * nums[i], q * nums[i])
45+
minf = min(nums[i], p * nums[i], q * nums[i])
46+
res = max(res, maxf)
47+
return res
3948
```
4049

4150
### **Java**
4251

4352
```java
44-
53+
class Solution {
54+
public int maxProduct(int[] nums) {
55+
int maxf = nums[0], minf = nums[0];
56+
int res = nums[0], n = nums.length;
57+
for (int i = 1; i < n; ++i) {
58+
int p = maxf, q = minf;
59+
maxf = Math.max(nums[i], Math.max(p * nums[i], q * nums[i]));
60+
minf = Math.min(nums[i], Math.min(p * nums[i], q * nums[i]));
61+
res = Math.max(res, maxf);
62+
}
63+
return res;
64+
}
65+
}
4566
```
4667

4768
### **...**

solution/0100-0199/0152.Maximum Product Subarray/Solution.java

+7-9
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
class Solution {
22
public int maxProduct(int[] nums) {
3-
int max[] = new int[nums.length];
4-
int min[] = new int[nums.length];
5-
int res = nums[0];
6-
max[0] = min[0] = nums[0];
7-
for(int i=1;i<nums.length;i++){
8-
int num = nums[i];
9-
max[i] = Math.max(Math.max(max[i-1]*num,min[i-1]*num),num);
10-
min[i] = Math.min(Math.min(min[i-1]*num,max[i-1]*num),num);
11-
res = Math.max(max[i],res);
3+
int maxf = nums[0], minf = nums[0];
4+
int res = nums[0], n = nums.length;
5+
for (int i = 1; i < n; ++i) {
6+
int p = maxf, q = minf;
7+
maxf = Math.max(nums[i], Math.max(p * nums[i], q * nums[i]));
8+
minf = Math.min(nums[i], Math.min(p * nums[i], q * nums[i]));
9+
res = Math.max(res, maxf);
1210
}
1311
return res;
1412
}
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,10 @@
1-
2-
# Beats 88% in python.
3-
class Solution(object):
4-
def maxProduct(self, nums):
5-
"""
6-
:type nums: List[int]
7-
:rtype: int
8-
"""
9-
if not nums:
10-
return 0
11-
localMin = localMax = maxi = nums[0]
12-
13-
for i in range(1, len(nums)):
14-
if nums[i] < 0:
15-
localMin, localMax = localMax, localMin
16-
17-
localMin = min(nums[i], localMin * nums[i])
18-
localMax = max(nums[i], localMax * nums[i])
19-
maxi = max(localMax, maxi)
20-
21-
return maxi
1+
class Solution:
2+
def maxProduct(self, nums: List[int]) -> int:
3+
maxf = minf = nums[0]
4+
res, n = nums[0], len(nums)
5+
for i in range(1, n):
6+
p, q = maxf, minf
7+
maxf = max(nums[i], p * nums[i], q * nums[i])
8+
minf = min(nums[i], p * nums[i], q * nums[i])
9+
res = max(res, maxf)
10+
return res

0 commit comments

Comments
 (0)