Skip to content

Commit 1b5532d

Browse files
author
wangpeng
committed
feat(MEDIUM): add _152_maxProduct
1 parent e51c28f commit 1b5532d

File tree

1 file changed

+82
-0
lines changed

1 file changed

+82
-0
lines changed
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package pp.arithmetic.leetcode;
2+
3+
/**
4+
* Created by wangpeng on 2019-05-08.
5+
* 152. 乘积最大子序列
6+
* <p>
7+
* 给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。
8+
* <p>
9+
* 示例 1:
10+
* <p>
11+
* 输入: [2,3,-2,4]
12+
* 输出: 6
13+
* 解释: 子数组 [2,3] 有最大乘积 6。
14+
* 示例 2:
15+
* <p>
16+
* 输入: [-2,0,-1]
17+
* 输出: 0
18+
* 解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
19+
*
20+
* @see <a href="https://leetcode-cn.com/problems/maximum-product-subarray/">maximum-product-subarray</a>
21+
*/
22+
public class _152_maxProduct {
23+
24+
public static void main(String[] args) {
25+
_152_maxProduct maxProduct = new _152_maxProduct();
26+
System.out.println(maxProduct.maxProduct(new int[]{2, 3, 2, -1, 0}));
27+
System.out.println(maxProduct.maxProduct(new int[]{-2, 0, -1}));
28+
System.out.println(maxProduct.maxProduct(new int[]{-2, 3, -4}));
29+
System.out.println(maxProduct.maxProduct(new int[]{0, 2}));
30+
}
31+
32+
/**
33+
* 解题思路:
34+
* 最暴力的方式当然是遍历到i,都和i之前的再循环一遍,找到最大值,双重遍历
35+
* 上面的解题时间会超,所以得考虑利用之前的遍历结果,==>动态规划
36+
* <p>
37+
* 求积的最大值,最麻烦的就是
38+
* 当遇到0的时候,整个乘积会变成0;当遇到负数的时候,当前的最大乘积会变成最小乘积,最小乘积会变成最大乘积
39+
* <p>
40+
* 所以用两个数组进行保存最大值和最小值
41+
* <p>
42+
* 当前的最大值等于已知的最大值、最小值和当前值的乘积,当前值,这三个数的最大值。
43+
* 当前的最小值等于已知的最大值、最小值和当前值的乘积,当前值,这三个数的最小值。
44+
* 结果是最大值数组中的最大值。
45+
* <p>
46+
* 数组可以进一步优化成int,空间复杂度从O(n)->O(1){@link _152_maxProduct#maxProduct2(int[])}
47+
*
48+
* @param nums
49+
* @return
50+
*/
51+
public int maxProduct(int[] nums) {
52+
if (nums.length == 0) return 0;
53+
if (nums.length == 1) return nums[0];
54+
int[] max = new int[nums.length];
55+
int[] min = new int[nums.length];
56+
int retVal;
57+
retVal = max[0] = min[0] = nums[0];
58+
for (int i = 1; i < nums.length; i++) {
59+
max[i] = Math.max(nums[i], Math.max(nums[i] * max[i - 1], nums[i] * min[i - 1]));
60+
min[i] = Math.min(nums[i], Math.min(nums[i] * max[i - 1], nums[i] * min[i - 1]));
61+
retVal = Math.max(retVal, max[i]);
62+
}
63+
64+
return retVal;
65+
}
66+
67+
public int maxProduct2(int[] nums) {
68+
if (nums.length == 0) return 0;
69+
if (nums.length == 1) return nums[0];
70+
int max, min, retVal, preMax, preMin;
71+
retVal = max = min = nums[0];
72+
for (int i = 1; i < nums.length; i++) {
73+
preMax = max;
74+
preMin = min;
75+
max = Math.max(nums[i], Math.max(nums[i] * preMax, nums[i] * preMin));
76+
min = Math.min(nums[i], Math.min(nums[i] * preMax, nums[i] * preMin));
77+
retVal = Math.max(retVal, max);
78+
}
79+
80+
return retVal;
81+
}
82+
}

0 commit comments

Comments
 (0)