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

(一)题目描述

给定一个数组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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值