美文网首页
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