找到两个不相容子数组的最大和
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)
给定一个数组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; }
相关文章推荐
- Unity5 新功能解析--GI(全局光)
- Populating Next Right Pointers in Each Node
- 《剑指offer》二叉树的深度
- URL tailing slash
- 【剑指offer】二十、字符串的排列
- 【转】获取/设置IFRAME内对象元素的几种JS方法
- 隔月生兔子 斐波纳契数列
- [Phonegap+Sencha Touch] 移动开发5、Sencha touch结合Phonegap使用
- 不要只因一次挫败,就放弃你原来决心想达到的梦想
- ACM 数塔/dp入门
- Baskets of Gold Coins Time Limit: 1000/1000 MS (Java/Others) Memory Lim
- 使用Camera与SurfaceView实现自定义拍照功能
- MAC OSX下查看某个端口被哪个程序占用及杀进程步骤
- 百度试题:度度熊
- 非常好用的sql语句(日常整理)
- Android中的颜色设置
- 七牛图片下载之Token生成
- Knots 2407 (规律题)
- POI生成Excel常见的几种样式的设置
- Qt的多线程编程注意事项