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;

你可能感兴趣的:(算法,LeetCode)