连续序列的最大和

假设有一个整形的数组,数组元素有正、负数。求连续出现的元素之和的最大值,并要求时空复杂度尽可能低。

举个例子,设S={-1,1,3,-2,5,-9,4},则连续出现的元素序列S'={1,3,-2,5}组成一个最大值7。那么,我们从何处着手解决呢?

首先,假设S中元素个数为N,并且已经找到一个和最大的元素序列S(i,j)(它表示从第i号到第j号的元素序列),记第i号元素为S[i],则有:

1 S[i-1]<0,S[i]>0,因为如果S[i-1]>0,则可以将S[i-1]加入到S(i,j)中,这样组成的序列和肯定大于原来的序列和,与假设矛盾;反之,若S[i]<0,则将S[i]从Sij中剔除,也可以组成一个“序列和”更大的序列,与假设矛盾。同理可得,S[j]>0,S[j+1](j<N)。

2 按照1的分析,扩展一下,可以得出:对于任意1<=u<=i-1,S(u,i-1)之和必然小于0;对于任意j<v<=N,S(j+1,v)之和也必然小于0。

根据1,首先必须找到第一个正数,令它为潜在的序列之首,扫描它后面的元素,如果它后面连续出现m个正数,则可以推断这m+1个元素为可能的“最大和序列中的子序列”。举个例子:

S[1],S[2],S[3]…S[i],S[i+1],S[i+m]…S[n],其中S[i+1]是第一个出现的正数,且S[i+2]…S[i+m]都为正数,则它“可能”作为子序列出现在“最大和”序列之中。那么,现在要做的工作就是,看能否扩展这个序列?如何扩展?

实际上,按照上面的分析思路,可以将序列S划分为若干个正数序列和负数序列交替出现的情况。比如S={-1},{1,3},{-2},{5},{-9},{4}。我们现在要做的就是在找到第一个正数序列之后,进行扩展,显然后面连续出现的序列为一个负数序列和正数序列,如果正数序列之和大于负数序列之和的绝对值,就将它们扩展进来,比如上面的第一个正数序列为{1,3},由于{5}>|{-2}|,当前的最大和序列变为{1,3,-2,5}。如果正数序列之和小于或等于负数序列之和的绝对值。则以当前所找到的正数序列作为起始点,按照上面的方法迭代下去,需要注意的就是要拿当前所求的最大和与上一次所求的最大和做比较,然后保留更大的值。不难得出,时间为O(N),额外空间O(1)。

有了上面的分析之后,编写就变得很简单了:

 

PS:代码直接在Live Writer里写的,没测试过,应该没什么大问题吧~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值