给定一个整数数组,找出两个 不重叠 子数组使得它们的和最大。
每个子数组的数字在数组中的位置应该是连续的。
返回最大的和。
注意事项
子数组最少包含一个数
给出数组 [1, 3, -1, 2, -1, 2]
这两个子数组分别为 [1, 3]
和 [2, -1, 2]
或者 [1, 3, -1, 2]
和 [2]
,它们的最大和都是 7
/*
数组left ,left[i] 表示从0 到i 这个区间内元素的最大值
同样可以求从i 到 size-1 这个区间的最大值
上面两个值之和的最大值就是答案了
第二个for循环也就是求i 到size -1区间内的全局最大值,然后就想到可以再定义一个数组
right right[i] 表示从i 到 size -1这个区间的最大
下面只需要根据这个两个数组求出最大值的和就好了
max = Math.max(left[i] + right[i+1],max)
再说明下:
left[i] 表示从0 到i 这个区间的最大值
right[i+1] 表示从 i + 1 都 size-1 这个区间的最大值
*/
//左边和右边分别计算max subarray,然后两边加起来最大的就是结果
public class Solution {
public int maxTwoSubArrays(ArrayList<Integer> nums) {
int size = nums.size();
if(nums == null || size == 0)return 0;
int[]left = new int[size];
int[]right = new int[size];
int max = Integer.MIN_VALUE;
int localMax =0;
//保存过程中的最大值
int globalMax = Integer.MIN_VALUE;
for(int i =0;i<size;i++){
localMax = Math.max(localMax+nums.get(i),nums.get(i));
globalMax = Math.max(localMax,globalMax);
left[i] = globalMax;
}
localMax= 0;
globalMax = Integer.MIN_VALUE;
for(int i = size-1;i>=0;i--){
localMax = Math.max(localMax+nums.get(i),nums.get(i));
globalMax = Math.max(localMax,globalMax);
right[i] = globalMax;
}
for(int i =0;i<size-1;i++){
//left[i] 表示从0 到i 这个区间的最大值
//right[i+1] 表示从 i + 1 到 size-1 这个区间的最大值
max = Math.max(max,left[i]+right[i+1]);
}
return max;
}
}