LintCode-最大子陣列 II
阿新 • • 發佈:2019-02-01
題目:
給定一個整數陣列,找出兩個 不重疊 子陣列使得它們的和最大。
每個子陣列的數字在陣列中的位置應該是連續的。
返回最大的和。
分析:
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;