题目:
给定一个整数数组,找出两个 不重叠 子数组使得它们的和最大。
每个子数组的数字在数组中的位置应该是连续的。
返回最大的和。
分析:
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;