描述
给定一个整数数组,找出两个 不重叠 子数组使得它们的和最大。
每个子数组的数字在数组中的位置应该是连续的。
返回最大的和。
子数组最少包含一个数
样例
给出数组 [1, 3, -1, 2, -1, 2]
这两个子数组分别为 [1, 3]
和 [2, -1, 2]
或者 [1, 3, -1, 2]
和 [2]
,它们的最大和都是 7
挑战
要求时间复杂度为 O(n)
思路:每次都有一个位置把数组分为两个部分,然后分别求出这两部分的最大子数组,然后循环一遍,求最大值。
两个子数组的范围为 0-i, i+1 - n。
对于后面那个子数组,我们从尾部向前依次求得子数组的最大和。
java代码:
public int maxTwoSubArrays(ArrayList<Integer> nums) { // write your code int size = nums.size(); int[] left = new int[size]; int[] right = new int[size]; int sum = 0; int minSum = 0; int max = Integer.MIN_VALUE; for(int i = 0; i < size; i++){ sum += nums.get(i); max = Math.max(max, sum - minSum); minSum = Math.min(sum, minSum); left[i] = max; } sum = 0; minSum = 0; max = Integer.MIN_VALUE; for(int i = size - 1; i >= 0; i--){ sum += nums.get(i); max = Math.max(max, sum - minSum); minSum = Math.min(sum, minSum); right[i] = max; } max = Integer.MIN_VALUE; for(int i = 0; i < size - 1; i++){ max = Math.max(max, left[i] + right[i + 1]); } return max; }