LeetCode 53. Maximum Subarray

題目大意:
有一數組,找到其中連續的子串,使其的和最大,其中子串至少有一個數字。也就是最大子串和。
解決思路:
維護一個最大值maxnmaxn和一個和值sumsumsumsum計算前幾個數字的和。因爲這些數字有正數與負數,因此sumsum就有可能是正數,0和負數。

  • 如果已經是負數了,就沒有必要再加了,即使後面的是正數。因爲拋棄掉前面的負數,重新開始加上後面的正數,sumsum不就會更大了嘛;如果後面是負數,那就更沒有必要繼續加了。因此,如果sumsum到了負數了,就不要繼續加了,把sumsum置零,重新加和後面的數字吧。
  • 如果是0或者是正數,那就可以大膽地繼續加和。即使加上的是負數也沒有關係,因爲即使sumsum變小了,但不是還有maxnmaxn來記錄最大值嘛!因此每次加和完了以後都要把sumsummaxnmaxn比較一下,取其中的最大值。
    最後代碼如下,時間複雜度O(N)O(N),空間複雜度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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章