1. 程式人生 > >【劍指offer】42、連續子數組的最大和

【劍指offer】42、連續子數組的最大和

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、連續子數組的最大和