题目:最大子数组和 力扣
思路:本次i最大值curMax为curMax加上当前元素或者当前元素作为curMax的新值, 更新总体最大值res为本次最大值curMax或者仍然是res。
代码:
var maxSubArray = function(nums) {
let curMax = nums[0]
let res = nums[0]
for (let i = 1; i < nums.length; i ++) {
curMax = Math.max(curMax + nums[i], nums[i])
res = Math.max(curMax, res)
}
return res
};
结果:
题目:乘积最大子数组 力扣
思路:与上题不同,乘积的话负负得正,也就是说最小的乘积可能存在翻身机会,比如当前数是负数,最小乘积乘上之后立马变成最大乘积了。由此,可在上题思路中,同时计算一个最小值curMin,同样每次更新curMax、curMin、res
代码:
var maxProduct = function(nums) {
let curMax = nums[0]
let curMin = nums[0]
let res = nums[0]
for (let i = 1; i < nums.length; i ++) {
const temp1 = curMax * nums[i], temp2 = curMin * nums[i]
curMax = Math.max(temp1, temp2, nums[i])
curMin = Math.min(temp1, temp2, nums[i])
res = Math.max(curMax, res)
}
return res
};