0
点赞
收藏
分享

微信扫一扫

LeetCode【152】乘积最大子数组

回溯 2023-10-12 阅读 28

题目:
在这里插入图片描述
解析:
在这里插入图片描述

  • 理解这个题的过程中,有这样的疑问:
    -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;
 }
举报

相关推荐

0 条评论