天天看點

聯機算法——求最大子序和

給定一個整數數組 

nums

 ,找到一個具有最大和的連續子數組(子數組最少包含一個元素),傳回其最大和。

示例:

輸入: [-2,1,-3,4,-1,2,1,-5,4],
輸出: 6
解釋: 連續子數組 [4,-1,2,1] 的和最大,為 6。      

聯機算法:聯機算法是在任意時刻算法對要操作的資料隻讀入(掃描)一次,一旦被讀入并處理,它就不需要在被記憶了。而在此處理過程中算法能對它已經讀入的資料立即給出相應子序列問題的正确答案。

思路:

       對于這道題使用聯機算法,首先儲存目前數組的第一位作為第一次處理的結果,之後對于每次求子序和都判斷它是否大于目前已經存儲的子序和。同時因為是求最大子序和,是以如果目前子序和小于0的話則将他歸0,然後記錄下一次要相加的資料。這樣做的好處就是每次求子序和的時候都會對于上一次的子序和的結果進行小于0的處理,使他永遠都是大于等于0的情況,然後在和目前項進行相加。這樣對于每次的子序和都會先儲存之前的最優解然後再對目前項進行處理。

代碼如下:

public class Solution {
    public int MaxSubArray(int[] nums) {
        int sum = 0;
        int max = nums[0];
        for(int i = 0; i < nums.Length; i++){
            sum += nums[i];
            if(sum > max){
                max = sum;
            }
            if (sum < 0){
                sum = 0;
            }
        }
        return max;
    }
}
           

複雜度為O(n);