求和最大的连续子序列问题分…

  问题:给出一个整形数组a,长度为n,求其和最大的连续字序列。
  1 最原始的思路,两个for循环迭代 也是最暴力的解法
  best = a[0];
    for(i = 0; i < n; i++){
         int sum = 0;
         for(j = i; j <  n; j++){
               sum += a[j];
               if(sum > best)
                     best = sum;
        }
   }
 时间复杂度是T(n) = O(n^2)

 2 查看了一下别人的优化算法 联机算法 时间复杂度仅为O(n),如下:
 
sum = a[1], temp = a[1];
 for(int i = 2; i <= n; i++){
        if(sum > 0)
             temp += a[i];
        else
             temp = a[i];
        if(temp > sum)
             sum = temp;
   
      时间复杂度: T(n) = O(n)。
联机算法:

  在任意时刻,算法都能对它已经读入的数据给出子序列问题的正确答案。具有这种特性的算法叫做联机算法(on-line algorithm)。仅需要常量空间并以线性时间运行的联机算法几乎是完美的算法。

  我对这个算法顶礼膜拜不已,仅需要一个整形变量的空间辅助,并且仅仅一个循环便貌似轻松搞定问题。
  然后是考虑边界以及输入的各种可能性,对于边界,该算法仅有和式运算,不是钻牛角尖的话一般不会有溢出,但如果真要考虑这点,则可以将sum以及temp设置为long型。对于输入,假设给出的数组中元素全部为负数,上述算法也能找出单个最大的那个元素并输出,也没问题。
  问题的深入:假设我想获取这个连续最大的字序列,算法又该如何?接下来有更新。
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值