美文网首页
152. 乘积最大子数组

152. 乘积最大子数组

作者: justonemoretry | 来源:发表于2021-08-31 20:59 被阅读0次
    image.png

    解法

    class Solution {
        public int maxProduct(int[] nums) {
            // 和连续子序列和思想类似,只不过因为负号的存在要维护两个数组
            int len = nums.length;
            // 分别代表以i为结尾的连续子数组,对应的最大值和最小值
            int[] maxDp = new int[len];
            int[] minDp = new int[len];
            maxDp[0] = nums[0];
            minDp[0] = nums[0];
            for (int i = 1; i < len; i++) {
                maxDp[i] = Math.max(minDp[i - 1] * nums[i], Math.max(maxDp[i - 1] * nums[i], nums[i]));
                minDp[i] = Math.min(maxDp[i - 1] * nums[i], Math.min(minDp[i - 1] * nums[i], nums[i]));
            }
            int maxRes = maxDp[0];
            for (int i = 1; i < maxDp.length; i++) {
                maxRes = Math.max(maxDp[i], maxRes);
            }
            return maxRes;
        }
    }
    

    dp只依赖于前一个状态,使用滚动数组

    class Solution {
        public int maxProduct(int[] nums) {
            // 和连续子序列和思想类似,只不过因为负号的存在要维护两个数组
            int len = nums.length;
            // 分别代表以i为结尾的连续子数组,对应的最大值和最小值
            int maxDp = nums[0];
            int minDp = nums[0];
            int maxRes = maxDp;
            for (int i = 1; i < len; i++) {
                int preMax = maxDp;
                int preMin = minDp;
                maxDp = Math.max(minDp * nums[i], Math.max(preMax * nums[i], nums[i]));
                minDp = Math.min(preMax * nums[i], Math.min(preMin * nums[i], nums[i]));
                maxRes = Math.max(maxRes, maxDp);
            }
            return maxRes;
        }
    }
    

    相关文章

      网友评论

          本文标题:152. 乘积最大子数组

          本文链接:https://www.haomeiwen.com/subject/jikviltx.html