【劍指offer】42、連續子數組的最大和
阿新 • • 發佈:2018-07-21
class 分享 因此 eat 組成 連續 最大和 累加 ret
題目
輸入一個整型數組,數組裏有正數也有負數。數組的一個或連續多個整數組成一個子數組。求所有子數組的最大和。要求時間復雜度為O(n)
思路一
試著從頭到尾累加每個數字,若發現有子數組和小於零,則加上後面的數字肯定會變小
因此丟棄這組子數組,從後面一個數字開始重新累加
例如{1,-2,3,10,-4,7,2,-5}
1+(-2)=-1
3+10-4+7+2=18
3+10-4+7+2-5=13
因此是18
需要註意的是,記錄最大值的初始值要設置成INT_MIN,因為最大值可能是負數。
class Solution { public: int FindGreatestSumOfSubArray(vector<int> array) { if (array.size() == 0) return 0; // 數組中最大值可以是負數,因此最大值不能設成0 int sum = 0, max = INT_MIN; int len = array.size(); for (int i = 0; i < len; i++){ if (sum < 0){ sum = array[i]; // 從下一個數字開始累加 }else { sum = sum + array[i]; } if (sum > max){ // 記錄最大值 max = sum; } } return max; } };
思路二
也可以用動態規劃做,其實和前面思想類似。
用f(i)表示以i結尾的子數組最大和
class Solution { public: int FindGreatestSumOfSubArray(vector<int> array) {if (array.size() == 0) return 0; int f = array[0], sum = array[0]; for (int i = 1; i < array.size(); i++){ if (f <= 0) f = array[i]; else f = f + array[i]; sum = (f > sum)? f: sum; } return sum; } };
【劍指offer】42、連續子數組的最大和