題目大意:
有一數組,找到其中連續的子串,使其的和最大,其中子串至少有一個數字。也就是最大子串和。
解決思路:
維護一個最大值和一個和值。計算前幾個數字的和。因爲這些數字有正數與負數,因此就有可能是正數,0和負數。
- 如果已經是負數了,就沒有必要再加了,即使後面的是正數。因爲拋棄掉前面的負數,重新開始加上後面的正數,不就會更大了嘛;如果後面是負數,那就更沒有必要繼續加了。因此,如果到了負數了,就不要繼續加了,把置零,重新加和後面的數字吧。
- 如果是0或者是正數,那就可以大膽地繼續加和。即使加上的是負數也沒有關係,因爲即使變小了,但不是還有來記錄最大值嘛!因此每次加和完了以後都要把和比較一下,取其中的最大值。
最後代碼如下,時間複雜度,空間複雜度:
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;