给定一个整数数组,找出两个不重叠子数组使得它们的和最大。
每个子数组的数字在数组中的位置应该是连续的。
返回最大的和。
样例
给出数组[1, 3, -1, 2, -1, 2],这两个子数组分别为[1, 3]和[2, -1, 2]或者[1, 3, -1, 2]和[2],它们的最大和都是7
注意
挑战 要求时间复杂度为O(n)
子数组最少包含一个数
class Solution {
public:
/**
* @param nums: A list of integers
* @return: An integer denotes the sum of max two non-overlapping subarrays
*/
int maxTwoSubArrays(vector<int> nums) {
// write your code here
int n = nums.size();
int left[n];
left[0] = nums[0];
int right[n];
right[n-1] = nums[n-1];
int sum = nums[0];
int maxVal = nums[0];
for (int i = 1; i < n; i++)
{
if (sum < 0)
{
sum = nums[i];
}
else
{
sum += nums[i];
}
if (sum > maxVal)
{
maxVal = sum;
}
left[i] = maxVal;
}
sum = nums[n-1];
maxVal = nums[n-1];
for (int i = n-2; i >= 0; i--)
{
if (sum < 0)
{
sum = nums[i];
}
else
{
sum += nums[i];
}
if (sum > maxVal)
{
maxVal = sum;
}
right[i] = maxVal;
}
int result = INT_MIN;
for (int i = 0; i < n-1; i++)
{
result = max(result, left[i]+right[i+1]);
}
return result;
}
};