递归方法解决最大连续子数列问题
2016-03-20 20:56
239 查看
最大连续子数列
最大连续子数列问题是给定一组数字,求出这组数字中的某一段连续数字中的最大值。例如:0,-1,3,-2,5,1;这组数字中的最大连续子数列是3+(-2)+5+1=7用递归方法解决连续子数列问题
将一组数字分为左半部分和右半部分,则会出现以下两种情况:1、最大连续子数列在左半部分或右半部分
2、最大连续子数列第一个数 i 在左半部分,最后一个数 j 在右半部分。
第一步:递归判断基准
当只有单一元素时,返回此元素
if(left==right) return Array[left]; //递归到最后left=right ,返回这一个值;
第二步:将给定的数组递归成只有单一元素
int center=(left+right)/2; int maxLeft=maxSubSumRec(Array,left,center); //向左递归; int maxRight=maxSubSumRec(Array,center+1,right); //向右递归; int Theleft=0,Theright=0,i=0; //左半部分和右半部分递加值初始化 int tempL=0,tempR=0; for(i=center;i>=left;--i){ tempL+=Array[i]; if(tempL>Theleft) Theleft=tempL; } for(i=center+1;i<=right;++i){ tempR+=Array[i]; if(tempR>=Theright) Theright=tempR; } int Theleftright=Theleft+Theright,Max=0; Max=maxLeft>maxRight?maxLeft:maxRight; Max=Theleftright>Max?Theleftright:Max; return Max;
中间值求法:
左半部分:从中间center开始,先向左遍历并把数组每个元素相加,每一步相加得到值Theleft,并与maxLeft作比较,把较大的值赋
给maxLeft。这样便求得了左半部分的最大连续子数列,右半部分同理。将左半部分和右半部分的最大值相加便是中间值。最后返回这
三个值中的最大值,便是整段数的最大连续子数列。
举例:0-13-25
1
中间值为3,左半部分最大值为3,右半部分为4,中间值为3+4=7,返回三个数中的最大值7.所以7为这段数的最大连续子数列
相关文章推荐
- 如何使CSDN博客写得更加流畅漂亮?
- USB接口定义
- linux shell 解读 “永久环境变量” “临时环境变量”和"普通变量"
- 《Java程序设计》第三周学习总结
- Hibernate逍遥游记-第12章 映射值类型集合-005对集合排序Map(<order-by>\<sort>)
- Android studio 配置JNI环境
- jmeter使用BeanShell Sampler测试自己写的java接口(二)
- Problem M
- struts 标签库select、datepicker、checkboxlist、doubleselect标签使用学习笔记
- AngularJS中的指令实践开发指南(二)
- 数据结构课设 修理牧场 (哈夫曼树基础)
- 汇编 压栈出栈
- TortoiseSVN客户端重新设置用户名和密码
- 20145312 《Java程序设计》第三周学习总结
- 学习前端的第一天~
- 【游戏】猜数字
- 【c++】冒泡法排序
- java双缓冲
- 【c++】冒泡法排序
- Hibernate逍遥游记-第12章 映射值类型集合-005对集合排序(<order-by>\<sort>)