最大子序列
来源:互联网 发布:mac osx 的route命令 编辑:程序博客网 时间:2024/04/28 04:52
最大子序列问题是一个面试中经常被问到的问题:给定一个整数序列,求这个整数序列中和最大的连续子序列。思想如下:例如,为了求A这个整数序列(下标为0~N)的最大子序列,我们用max这个变量(初始为0)记录最大子序列的和,然后从0开始遍历这个序列,用begin和end变量(初始都为0)记录当前子序列的开始和结束下标,用currentSum记录当前子序列的和,假设我们遍历到了i,如果currentSum大于0:说明我们可以继续往后走(因为A[i+1]+大于0的数>A[i+1]),进一步,如果currentSum大于max,我们就更新max为currentSum,同时更新end的值为i;如果currentSum小于0:说明我们不能继续往后走,那么我们要丢弃当前子序列(begin~i),更新begin为i+1。最后遍历到N我们就能得到begin和end之间的子序列就是我们要求的最长子序列,max就是最长子序列的和。可能这样讲比较抽象,那么不多说,直接上对应的代码(JAVA实现):
/** * * @author kerry * 最大子序列问题:给定一个整数序列(有正有负),求和最大的连续子序列及其对应的和 * */public class BiggestSubsequence {public static void main(String[] args) {// TODO Auto-generated method stubint[] a={-1,-6,-1,-2};int[] out=bs(a);System.out.println(out[0]+":"+out[1]+":"+out[2]);}/** * * @param a * 从头开始计算序列的和,如果大于0,计算当前序列(begin和end之间)的和currentSum,并比较这个和与当前最大和max的大小 * 如果大于则更新end的值,如果小于则丢弃当前序列,更新begin的值为i+1 */public static int[] bs(int[] a){int max=0;//记录最大的和int begin=0;//记录连续子序列的开始下标int end=0;//记录连续子序列的结束下标int currentSum=0;//记录当前子序列的和for(int i=0;i<a.length;i++){currentSum+=a[i];if(currentSum>0){if(currentSum>max){max=currentSum;end=i;}}else if(currentSum<=0){begin=i+1;currentSum=0;}}int[] out={max,begin,end};return out;}}注意,上述代码存在bug,因为我们初始化max为0,现在看这种情况,加入给出的序列a全是负数,那么按照上面的思路就不行,因为currentSum始终为负数,max就一直为0,begin也会一直更新,最后的值为a的长度,而end则一直为0。显然,这种情况是不符提议的,对于整数序列全部是负数的情况,可以单独考虑,直接找出所有负数中最大的负数即可。
如果错误请多多指出,谢谢!
0 0
- 最大子序列
- 最大子序列问题
- 最大子序列问题
- 最大子序列
- 最大子序列
- 最大子序列
- 最大子序列
- 最大子序列问题
- 求最大子序列
- 最大子序列和
- hdu1231 最大子序列
- 最大子序列
- 最大子序列和
- 最大递归子序列
- DP最大子序列
- 最大和子序列
- 最大子序列问题
- 最大连续子序列
- taskset
- Speed Limit
- 2014广东省赛赛后总结╮(╯▽╰)╭
- Android修炼之道—高仿陌陌的项目
- c++实现静态循环队列的各种操作
- 最大子序列
- 金蝶K/3现金流量表余额不正确校验方法(更新)(
- 最大公约数和最小公倍数问题
- 2014.5.11 DAO设计模式为什么要用到工厂类?
- Java FilenameFilter的简单应用选择.gif.bng.jpg格式的图片
- Linux下Mysql5.5的Cmake安装以及sphinx结合
- 新辰:4G时代如何利用手机进行移动APP营销?
- Android中使用SQLiteOpenHelper管理SD卡中的数据库
- TRF1122中文数据手册综述