Lintcode: 42. 最大子陣列 II
阿新 • • 發佈:2018-11-04
描述
給定一個整數陣列,找出兩個 不重疊 子陣列使得它們的和最大。
每個子陣列的數字在陣列中的位置應該是連續的。
返回最大的和。
樣例
給出陣列 [1, 3, -1, 2, -1, 2]
這兩個子陣列分別為 [1, 3]
和 [2, -1, 2]
或者 [1, 3, -1, 2]
和 [2]
,它們的最大和都是 7
挑戰
要求時間複雜度為 O(n)
dalao思路:left陣列表示0-i這個區間內和最大的子陣列,right陣列表示i-nums.size()-1這個區間內和最大的子陣列
public int maxTwoSubArrays(List<Integer> nums) { if(nums == null || nums.size() == 0) { return 0; } int maxSum = nums.get(0),curSum = 0; int []left = new int[nums.size()]; int []right = new int[nums.size()]; for (int i = 0;i < nums.size();i++) { curSum += nums.get(i); maxSum = Math.max(maxSum,curSum); curSum = Math.max(curSum,0); left[i] = maxSum; } curSum = 0; maxSum = nums.get(nums.size()-1); for (int i = nums.size()-1;i > 0;i--) { curSum += nums.get(i); maxSum = Math.max(maxSum,curSum); curSum = Math.max(curSum,0); right[i] = maxSum; } maxSum = Integer.MIN_VALUE; for (int i = 0;i < nums.size()-1;i++) { maxSum = Math.max(maxSum,left[i] + right[i+1]); } return maxSum; }
//前後遍歷、列舉法 summary: 1、前後遍歷的思想/interval 型別題也可以參考,因為兩個子陣列不能重合,先正向遍歷得到0-i位置內最大子陣列,maxSum = Math.max(maxSum,curSum);保證了left[i]會是這區間的最大值。也有一點動態規劃dp的思路 2、因為interval不能重合,所以正反遍歷,並且有一個變量表示符合一個區間符合條件的值