劍指Offer-連續子陣列中的最大和

起個名字都這麼男發表於2020-12-08

題目

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

輸入
[1,-2,3,10,-4,7,2,-5]
返回值
18
說明:
輸入的陣列為{1,-2,3,10,—4,7,2,一5},和最大的子陣列為{3,10,一4,7,2},因此輸出為該子陣列的和 18。

分析

定義一個dp陣列,dp[i]表示前i個元素的最大和。狀態方程
dp[i] = dp[i-1]<0?array[i]:dp[i-1]+array[i-1];當前元素與他前面的元素的在求最大和時有兩個選擇,如果,前面子陣列的最大和時正數就加上前面陣列的最大和,反之不加。最後宣告一個max變數儲存最大值。最終返回max;

例如:
[1,-2,3,10,-4,7,2,-5]
dp[0] = 1
dp[1] = -1
dp[2] = 3
dp[3] = 13
dp[4] = 9
dp[5] = 16
dp[6] = 18
dp[7] = 13
所以最終最大和是dp[6] = 18

程式碼實現

public class Solution {
    public int FindGreatestSumOfSubArray(int[] array) {
        //如果陣列為空返回0
        if(array == null) return 0;
        
        //當前元素與他前面的元素的關係只有兩種狀態,加上與不加上他們的最大值,加不加看dp[i-1]的正負也即是
        //dp[i] = dp[i-1]<0?array[i]:dp[i-1]+array[i-1];
        //max = Math.max(dp[i],max)
        int len = array.length;
        int dp[] = new int[len];
        dp[0] = array[0];
        int max=array[0];
       
        
        for(int i=1;i<len;i++){
            dp[i] = dp[i-1]<0?array[i]:dp[i-1]+array[i];
            max = Math.max(dp[i],max);
        }
        return max;
    }
}

空間複雜度O(n);時間複雜度O(n);

太菜了演算法,繼續努力吧!

相關文章