这一题比较典型的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
};