题目:
解析:
-
理解这个题的过程中,有这样的疑问:
-2、0、2、3 子数组最大值是2*3 = 6,并非dp过程中,从下标0累乘的怎么办?这里不用担心,因为在dp的过程中会逐渐的求Math.max和Math.min。 -
这里dp的思路是,当前最大乘积dp[i] 一定是dp[i-1] 或者是dp[i-1] * nums[i]
-
这里不同于传统的dp题目,需要一个dp[]保存中间的dp结果,而是使用dpMax 和 dpMin保存dp过程中的最大值最小值。
-
此题重点理解公式推导
参考:
https://blog.csdn.net/weixin_43972154/article/details/123677014
待学习:滚动数组
代码:
public int maxProduct(int[] nums) {
int dpMax = nums[0], dpMin = nums[0];
int res = nums[0];
for (int i = 1; i < nums.length; i++) {
int now1 = dpMax * nums[i];
int now2 = dpMin * nums[i];
dpMax = Math.max(nums[i], Math.max(now1, now2)); // 只有变得更大或更小了才会被记录,不用担心前面的值影响最大最小结果。
dpMin = Math.min(nums[i], Math.min(now1, now2));
res = Math.max(res, dpMax); // 为什么要变计算中间结果? [2,3,-2,4] 如果不计算,最后就输出4
}
return res;
}