【LeetCode每日一题】152. 乘积最大子数组

题目:

给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。

思路

由于做了53. 最大子数组和

下意识觉得求出所有元素的以该元素结尾的连续子数组的最大值,然后最大值数组里求最大值。

如何求以某个元素结尾的连续子数组最大值呢?

首先约定:

preMax 表示以前一个元素结尾的连续子数组的最大值,

preMin 表示以前一个元素结尾的连续子数组的最小值

由于思维定势,会觉得是 max = Math.max(元素A,元素A*preMax )。

但是这样是错误的。

例如:[-2,3,-2]

第一个元素最大值是 -2 ,第二个元素最大值是3,第三个元素最大值是12。

但是根据公式,第三个元素最大值 = Math.max(-2*3,-2)= -2.

原因就在于数组里的元素是有正负的,如果只是正数,那么这个方式是可以的。

所以如何求以某个元素结尾的最大值呢?

如果该元素是负数,max = Math.max( 元素, 元素*preMin )

如果该元素是正数,max = Math.max( 元素, 元素*preMax)

因此对于每个元素都要记录最小值与最大值。

如果该元素是负数,max = Math.max( 元素, 元素preMin) min = Math.min( 元素, 元素preMax)

如果该元素是正数,max = Math.max( 元素, 元素preMax) min = Math.min( 元素, 元素preMin)

max = Math.max(元素, 元素preMin,元素preMax)

min = Math.min( 元素, 元素preMin,元素preMax)

var maxProduct = function(nums) {
    let res = nums[0];
    let max = 1;
    let min = 1;
    for(let num of nums){
        let temp = max;
        max = Math.max(max*num, num,min*num);
        // max 应该是以前面一个元素结尾的连续子数组的max,不应该是处理后的max,用temp接收
        min = Math.min(min*num,num,temp*num);
        res = Math.max(res, max);
    }
    return res;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凭栏听雨客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值