算法:最大子数组和、乘积最大子数组(js)

题目:最大子数组和 力扣

思路:本次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
};

猜你喜欢

转载自blog.csdn.net/qq_43119912/article/details/123980895