leetcode-53 Maximum Subarray 連續子數組的最大和

問題描述:

Find the contiguoussubarray within an array (containing at least one number) which has the largestsum.

For example, given the array [−2,1,−3,4,−1,2,1,−5,4],
the contiguous subarray 
[4,−1,2,1] has the largest sum = 6.

 

問題分析:

《劍指Offer》題31

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

 

    顯然,一個數值加上一個負值,所得到的結果自然小於其本身。

    使用一個curSum變量來記錄當前所考察的子數組的當前和,curMax變量來記錄當前所得到的最大值;

    遍歷數組,若curSum爲負值,則加上當前值num[i],所得到的和一定小於num[i],則直接將前面的子數組捨棄,取當前值爲下一個繼續考察的子數組的起點,則curSum=nums[i];

    若curSum爲正值,可想而知,直接加上num[i]會得到更大值;

    比較當前獲得的curSum與之前獲得的最大值,每一步都得到當前的最大值,則最終獲得的最大值即爲curMax所記錄的值。

 

代碼:

public class Solution {
    public int maxSubArray(int[] nums) {
        // 消除不合法情況
        if ((nums == null) || (nums.length == 0))
            return 0;

        // 初始化
        int curSum = nums[0]; // 記錄當前的子數組的Sum總和
        int curMax = nums[0]; // 記錄當前的最大Sum值

        // 進行遍歷
        for (int i = 1; i < nums.length; i++) {
            // 因爲若之前的子數組的和小於0,加上當前值只會讓總值Sum減小,故選擇丟棄之前值
            if (curSum <= 0)  curSum = nums[i];
            else curSum += nums[i];

            // 判斷是否大於之前的最大值
            if (curSum > curMax) curMax = curSum;
        }

        return curMax;
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章