数据结构与算法1——子序列最大问题

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

     

转载于:https://www.cnblogs.com/guoshiyv/p/7020719.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值