您的位置:首页 > 其它

找到两个不相容子数组的最大和

2015-09-12 16:25 197 查看
(一)题目描述

给定一个数组arr,其中有很多的子数组,找到两个不相容子数组使得相加的和最大,并返回和的最大值。比如,数组[1,-1,0,-2,3,5,-2,8,7,-4],两个不相容子数组分别为[3,5]和[8,7]时累加和最大,所以返回23。再比如,数组[3,-1,0,-2,3,5,-2,8,7,-4],两个不相容子数组分别为[3]和[3,5,-2,8,7]时累加和最大,所以返回24。

(二)算法思想

定义数组SubSum,SubSum[i]//表示从0,...,i上的最大子数组和。因此遍历一遍即可得到最大子和数组。将数组划分成不相容的两块,因此,从右往左回滚,此时SubSum[i]//表示i+1,...,N上的最大子数组的和。每一次回滚的同时也即可求得两个不相容的子数组和,更新并返回最大值。

时间复杂度:O(n)

int TwoSubArraySum(int *Array,int length)
{
int *SubSum=new int[length];
SubSum[0]=Array[0];
int temp=Array[0]<0?0:Array[0];
for(int i=1;i<length;i++)
{
temp+=Array[i];
SubSum[i]=max(SubSum[i-1],temp);
temp=temp<0?0:temp;
}
SubSum[length-1]=Array[length-1];
temp=SubSum[length-1]<0?0:SubSum[length-1];
int result=SubSum[length-2]+SubSum[length-1];
for(int i=length-2;i>=1;i--)
{
temp+=Array[i];
SubSum[i]=max(SubSum[i+1],temp);
temp=temp<0?0:temp;
result=max(result,SubSum[i]+SubSum[i-1]);
}
delete []SubSum;
return result;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: