给定一个整数数组,找出两个 不重叠 子数组使得它们的和最大。
每个子数组的数字在数组中的位置应该是连续的。
返回最大的和。
注意事项
子数组最少包含一个数
样例
分别为
给出数组 [1, 3, -1, 2, -1, 2]
这两个子数组
public class Solution {
/*
* @param nums: A list of integers
* @return: An integer denotes the sum of max two non-overlapping subarrays
*/
public int maxTwoSubArrays(List<Integer> nums) {
// write your code here
// int max=nums.get(0)+nums.get(1);
// for(int i=0;i<nums.size()-1;i++)
// {
// int sum1=nums.get(0),max1=sum1;
// for(int j=1;j<=i;j++)
// {
// if(sum1<=0)
// {
// sum1=nums.get(j);
// }else{
// sum1+=nums.get(j);}
// if(sum1>=max1)
// {
// max1=sum1;
// }
// }
// int sum2=nums.get(i+1),max2=sum2;
// for(int j=i+2;j<nums.size();j++)
// {
// if(sum2<=0)
// {
// sum2=nums.get(j);
// }else{
// sum2+=nums.get(j);}
// if(sum2>=max2)
// {
// max2=sum2;
// }
// }
// if(max<(max1+max2))
// {
// max=max1+max2;
// }
// }
// return max;
int[] max_left=new int[nums.size()];
int[] max_right=new int[nums.size()];
int sum1=nums.get(0);
max_left[0]=sum1;
for(int j=1;j<nums.size()-1;j++)
{
if(sum1<=0)
{
sum1=nums.get(j);
}else{
sum1+=nums.get(j);}
if(sum1>=max_left[j-1])
{
max_left[j]=sum1;
}else{
max_left[j]=max_left[j-1];
}
}
int sum2=nums.get(nums.size()-1);
max_right[nums.size()-1]=sum2;
for(int i=nums.size()-2;i>0;i--)
{
if(sum2<=0)
{
sum2=nums.get(i);
}else{
sum2+=nums.get(i);}
if (max_right[i+1] < sum2)
{ max_right[i] = sum2;}
else{
max_right[i] =max_right[i+1];}
}
int max=0;
max=max_left[0]+max_right[1];
for(int i=1;i<nums.size()-1;i++)
{
if(max<max_left[i]+max_right[i+1])
{
max=max_left[i]+max_right[i+1];
}
}
return max;
}
}
分别为
[1, 3]
和
[2, -1, 2]
或者
[1, 3, -1, 2]
和
[2]
,它们的最大和都是
7