LeetCode 152. 【Java】152. Maximum Product Subarray
原题链接
中等
作者:
tt2767
,
2020-03-16 16:03:04
,
所有人可见
,
阅读 643
/**
1. 数字有正有负, 乘正数 或 乘负数都有可能变大或变小, 所以需要维护最大正数和最小负数两个值
2. 动态规划:
2.1 状态定义: f[i] 是以i结尾的连续数组最大值, g[i] 是以i结尾的连续数组最小值
2.2 对于第i个数有2中选择:
2.2.1 接到前一段上面: 此时 f[i] = MAX(nums[i]*f[i-1], nums[i]*g[i-1]), g[i] = MIN(nums[i]*f[i-1], nums[i]*g[i-1]),
2.2.2 自己独立出来: 此时 f[i] = num[i], g[i] = nums[i]
分别维护上述两种情况的最大值和最小值
3. 初始情况: f[0] = g[0] = nums[0];
4. 由于每次只依赖前一个值, 所以可以做滚动优化, 并且用result 记录过程中的所有最大值即可
*/
class Solution {
public int maxProduct(int[] nums) {
int maxV = nums[0], minV = nums[0], result = nums[0];
for (int i = 1 ; i < nums.length ; i ++){
int[] candidates = {nums[i], maxV * nums[i], minV * nums[i]};
maxV = Arrays.stream(candidates).max().getAsInt();
minV = Arrays.stream(candidates).min().getAsInt();
result = Math.max(result, maxV);
}
return result;
}
}