1. 程式人生 > >聯機演算法——求最大子序和

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

給定一個整數陣列 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);