求N个连续数字中子序列最大的和以及起始和结束下标位置
- thissum存放当前子序列所求和,当thissum<0,不会使得以后的和变大,则从0重新开始计算新的子序列的和。
- 每一次更大的thissum都会被替换到新的maxsum中,
- 如果重新开始的新的子序列的总和大于上一个maxsum,起始位置是min,否则起始位置是minbefore,起始位置未被更新。
- 算法复杂度O(N)
代码示例:
-
#include <stdio.h> #include <math.h> void main() { int a[5]={300,4,-20,80,-34}; int i,minbefore,min,max,thissum,maxsum; max=min=minbefore=thissum=maxsum=0; for(i=0;i<5;i++) { thissum=thissum+a[i]; if(thissum>maxsum) {maxsum=thissum;max=i;} if(thissum<0) { if(min<=max)//更新minbefore,始终是当前最大的子序列的起始位置 {minbefore=min;} thissum=0; min=i+1; } } printf("从下标%d到下标%d的子序列和最大,是%d",min<=max?min:minbefore,max,maxsum);//min<=max,满足则是新的子序列最大,否则新的子序列不如旧的大,起始位置是minbefore }
本文介绍了一种求解连续数字序列中最大子序列和及其起始和结束位置的算法,并给出了具体的实现代码示例。

被折叠的 条评论
为什么被折叠?



