LeetCode 53. Maximum Subarray

题目大意:
有一数组,找到其中连续的子串,使其的和最大,其中子串至少有一个数字。也就是最大子串和。
解决思路:
维护一个最大值 m a x n maxn maxn和一个和值 s u m sum sum s u m sum sum计算前几个数字的和。因为这些数字有正数与负数,因此 s u m sum sum就有可能是正数,0和负数。

  • 如果已经是负数了,就没有必要再加了,即使后面的是正数。因为抛弃掉前面的负数,重新开始加上后面的正数, s u m sum sum不就会更大了嘛;如果后面是负数,那就更没有必要继续加了。因此,如果 s u m sum sum到了负数了,就不要继续加了,把 s u m sum sum置零,重新加和后面的数字吧。
  • 如果是0或者是正数,那就可以大胆地继续加和。即使加上的是负数也没有关系,因为即使 s u m sum sum变小了,但不是还有 m a x n maxn maxn来记录最大值嘛!因此每次加和完了以后都要把 s u m sum sum m a x n maxn maxn比较一下,取其中的最大值。
    最后代码如下,时间复杂度 O ( N ) O(N) O(N),空间复杂度 O ( 1 ) O(1) O(1):
int maxn = INT_MIN;
int sum = 0;
for(vector<int>::iterator it = nums.begin(); it != nums.end(); it++){
     sum += *it;
     maxn = max(sum, maxn);
     sum = sum < 0 ? 0 : sum;
}
return maxn;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值