題目說明
給你一個整數數組 nums ,請你找出數組中乘積最大的連續子數組(該子數組中至少包含一個數字),並返回該子數組所對應的乘積。
示例 1:
輸入: [2,3,-2,4]
輸出: 6
解釋: 子數組 [2,3] 有最大乘積 6。
示例 2:
輸入: [-2,0,-1]
輸出: 0
解釋: 結果不能爲 2, 因爲 [-2,-1] 不是子數組。
解題思路一
- 該題與之前所寫的560.和爲K的子數組很相似,解法也都是一樣的。
- 依舊是對前綴進行操作。不同的是,我們這次不需要保留所有的結果,只需要保留本次結果的最大值
nowMax
和最小值nowMin
。取min主要是爲了複數的情況。
- 我們依賴於上一次的狀態,求出本次的最大最小值。然後傳入下一次狀態。
1. nowMax = Math.max(res[0] * nums[i], res[1] * nums[i], nums[i]);
2. nowMin = Math.min(res[0] * nums[i], res[1] * nums[i], nums[i]);
3. res = [nowMax, nowMin ]
- 在此過程中我們可以求出最大值max
代碼實現一
var maxProduct = function(nums) {
if (!nums.length) {
return 0;
}
let max = nums[0]
let min = nums[0]
let res = [nums[0], nums[0]];
for (let i = 1 ; i < nums.length; i++) {
let nowMax = Math.max(res[0] * nums[i], res[1] * nums[i], nums[i]);
let nowMin = Math.min(res[0] * nums[i], res[1] * nums[i], nums[i]);
max = Math.max(nowMax, max);
res = [nowMax, nowMin];
}
return max;
};