求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 }