难度:中等
题目描述:
给你一个整数数组 nums
,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积
示例:
输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
解题思路:
暴力解法
var maxProduct = function(nums) {
if(nums.length < 2) return nums[0]
let max = -Infinity
for(let i = 0; i < nums.length; i++){
let total = nums[i]
max = Math.max(max, total)
for(let j = i + 1; j < nums.length; j++){
total *= nums[j]
max = Math.max(max, total)
}
}
return max
};
动态规划:
var maxProduct = function(nums) {
let max = nums[0]
let imax = 1
let imin = 1
for(let num of nums) {
if(num < 0) {
[imax, imin] = [imin, imax]
}
imax = Math.max(num, num * imax)
imin = Math.min(num, num * imin)
max = Math.max(imax, max)
}
return max
};
/**
如: nums = [2,3,-2,4]
循环
i
0 num = 2; imax = 2, imin = 1, max = 2
1 num = 3 imax = 6, imin = 1, max = 6
2 num = -2 < 0, 交换 => imax = 1, imin = 6 => imax = -2, imin = -12, max = 6
3 num = 4 imax = 4, imin = -48, max = 6
*/