LeetCode152 乘积最大子数组
题目
寻找的是 连续 子数组。
解题
解题一:动态规划
思路和 LeetCode53 最大子序和 动态规划解法类似:
解决方案:
// javascript
var maxProduct = function(nums) {
const n = nums.length;
let maxF = nums[0], minF = nums[0], ans = nums[0];
for (let i = 1; i < n; i++) {
// 先进行记录,不然下面 maxF 改变后,minF 计算值错误
const mx = maxF, mn = minF;
maxF = Math.max(nums[i], nums[i] * mx, nums[i] * mn);
minF = Math.min(nums[i], nums[i] * mx, nums[i] * mn);
ans = Math.max(maxF, ans);
}
return ans;
};
解题二:正向逆向结合
参考 python5行:不同于回溯、DP的tricks解法,核心思想是先分情况讨论,然后发现主要问题是解决 有奇数个负数的情况,注意 有 0 的情况。
// javascript
var maxProduct = function(nums) {
let numsLen = nums.length;
// 先比较省去下面 注释的部分
let maxRes = Math.max(nums[0], nums[numsLen - 1]);
let curRes;
curRes = nums[0];
for (let i = 1; i < numsLen; i++) {
// 当 curRes = 0 时,curRes = nums[i]
curRes = (curRes === 0) ? nums[i] : curRes * nums[i];
maxRes = Math.max(maxRes, curRes);
}
curRes = nums[numsLen - 1];
// maxRes = Math.max(maxRes, curRes);
for (let i = numsLen - 2; i >= 0; i--) {
curRes = (curRes === 0) ? nums[i] : curRes * nums[i];
maxRes = Math.max(maxRes, curRes);
}
return maxRes;
};