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
if (nums.size()==0)
{
return 0;
}
int n=nums.size();
vector<int> left(n,0);
vector<int> right(n,0);
int maxSum1=nums[0],sum1=0;
int maxSum2=nums[n-1],sum2=0;
int i=0,j=n-1;
for (;i<n;i++)
{
sum1+=nums[i];
if (sum1>maxSum1)
{
maxSum1=sum1;
}
if (sum1<0)
{
sum1=0;
}
left[i]=maxSum1;
}
for (;j>=0;j--)
{
sum2+=nums[j];
if (sum2>maxSum2)
{
maxSum2=sum2;
}
if (sum2<0)
{
sum2=0;
}
right[j]=maxSum2;
}
int sum=left[0]+right[1];
for (int k=1;k<n-1;k++)//k=n-1时left为整个nums的最大子数组和,不符合子数组不重叠要求,且right下标超出范围;
{
if (left[k]+right[k+1]>sum)
{
sum=left[k]+right[k+1];
}
}
return sum;
}
};
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
if (nums.size()==0)
{
return 0;
}
int n=nums.size();
vector<int> left(n,0);
vector<int> right(n,0);
int maxSum1=nums[0],sum1=0;
int maxSum2=nums[n-1],sum2=0;
int i=0,j=n-1;
for (;i<n;i++)//计算0~k的最大子数组和;
{
sum1+=nums[i];
if (sum1>maxSum1)
{
maxSum1=sum1;
}
if (sum1<0)
{
sum1=0;
}
left[i]=maxSum1;
}
for (;j>0;j--)//计算k+1~n-1的最大子数组和;
{
sum2+=nums[j];
if (sum2>maxSum2)
{
maxSum2=sum2;
}
if (sum2<0)
{
sum2=0;
}
right[j-1]=maxSum2;
}
int sum=left[0]+right[0];
for (int k=1;k<n-1;k++)//k=n-1时left为整个nums的最大子数组和,不符合子数组不重叠要求;
{
if (left[k]+right[k]>sum)
{
sum=left[k]+right[k];
}
}
return sum;
}
};