【leetcode】152. 乘积最大子数组

73 阅读1分钟

leetcode-152.png

这一题比较典型的dp,也可以节约dp的过程,用中间变量即可。
数组中可能存在负数,负负得正这个问题要解决,所以不能一开始就舍弃负数,可以用一个临时变量来存放

var maxProduct = function (nums) {
    let max = nums[0]
    let min = nums[0]
    let res = nums[0]
    for (let i = 1; i < nums.length; ++i) {
        let cur = nums[i]
        let tmpMax = max
        max = Math.max(cur, tmpMax * cur, min * cur)
        min = Math.min(cur, tmpMax * cur, min * cur)
        res = Math.max(res, max)
    }
    return res
};

dp解法,区分当前值的正负性,

var maxProduct = function (nums) {
    let n = nums.length
    let maxDp = new Array(n).fill(0)
    let minDp = new Array(n).fill(0)
    let res = nums[0]
    maxDp[0] = nums[0]
    minDp[0] = nums[0]
    for (let i = 1; i < n; ++i) {
        if (nums[i] >= 0) {
            maxDp[i] = Math.max(nums[i], maxDp[i - 1] * nums[i])
            minDp[i] = Math.min(nums[i], minDp[i - 1] * nums[i])
        } else {
            // 负负得正
            maxDp[i] = Math.max(nums[i], minDp[i - 1] * nums[i])
            minDp[i] = Math.min(nums[i], maxDp[i - 1] * nums[i])
        }
        res = Math.max(res, maxDp[i])
    }
    return res
};