题目大意:
有一数组,找到其中连续的子串,使其的和最大,其中子串至少有一个数字。也就是最大子串和。
解决思路:
维护一个最大值
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;