天天看點

算法學習之連續子數組的最大和

題目:輸入一個整型數組,數組裡有正數也有負數。數組中的一個或連續多個整數組成一個子數組。求所有子數組的和的最大值。要求時間複雜度為O(n)。

例如,輸入的數組為{1, -2, 3, 10, -4, 7, 2, -5},和最大的子數組為{3, 10, -4, 7, 2},是以輸出為該子數組的和18。

思路:動态規劃,通過周遊逐個累加和比對找尋最大連續子組

public class Solution {
    public int FindGreatestSumOfSubArray(int[] array) {
        if(array==null||array.length<=0)return 0;
        int max = Integer.MIN_VALUE;
        int sum = 0;
        for(int value:array){
            if(sum<=0){ // 不管首個數字還是累加值小于0時都重新指派,因為數組中肯定存在正整數,如果出現極端情況(隻有一個正整數)我們指針必須指向這個唯一的正整數
                sum = value;
            }else{
                sum+=value;
            }
            if(max<sum){
                max = sum;
            }
        }
        return max;
    }
}
           

時間複雜度:O(n)

空間複雜度:O(1)

繼續閱讀