1. 程式人生 > >LintCode-最大子陣列 II

LintCode-最大子陣列 II

題目:

給定一個整數陣列,找出兩個 不重疊 子陣列使得它們的和最大。
每個子陣列的數字在陣列中的位置應該是連續的。
返回最大的和。

分析:

1.求一個最小的分割陣列,然後在左右邊界兩邊再分別求兩個最大連續子陣列,但是對於左右邊界達到了原陣列的情況,需要從其內部找最大連續子陣列,此路不通。

2.直接求左右兩側的最大連續子陣列,由於一側取得最大的時候對於求另一側子陣列會有影響,導致和不一定為最大,所以區域性最優沒用,只能列舉。一種方法遍歷陣列,每求一個當前最大連續子陣列,巢狀求出剩餘部分的最大連續子陣列,O(n^2)。

3.先從左遍歷陣列,儲存遍歷到每個元素的當前的最大連續子陣列的值;從右遍歷陣列,記錄同樣的最大連續子陣列的值;遍歷陣列比較每種組合的左右最大連續子陣列的和值,返回最大的值。

程式碼:

int result = nums[0],sum = 0;
        vector<int> left(nums.size(),0),right(nums.size(),0);
        for (int i = 0;i < nums.size();i++) {
            sum += nums[i];
            result = max(result,sum);
            sum = max(sum,0);
            left[i] = result;
        }
        sum = 0,result = nums[nums.size()-1];
        for (int i = nums.size()-1;i > 0;i--) {
            sum += nums[i];
            result = max(result,sum);
            sum = max(sum,0);
            right[i] = result;
        }
        result = INT_MIN;
        for (int i = 0;i < nums.size()-1;i++) {
            result = max(result,left[i] + right[i+1]);
        }
        return result;