一个整数数组(正负,0),找出这个数组的最大子序列

http://blog.csdn.net/smking/article/details/4484070

数组子序列求和问题!

Author: Kevin (刘鑫)

问题描述

有一整型数组,其中元素可正、可负、也可为零。要求在该数组中找到一个子序列,其和在所有子序列中最大,并将该最大值及该子序列的起始和终止位置输出。

算法描述

1.max记录和的最大值,其初始值为矩阵的第一个元素;

2.sum记录当前的和;

3.遍历整个数组

3.1 将当前指向的数组元素累加到sum中;

3.2 判定sum是否大于max;如果大于就把sum值赋给max,并将end指向当前位置;

3.3 若上述条件不成立,则判定sum是否小于零;如果小于零,就说明前面所有元素的和对后面的求和过程起到消减的作用,就抛弃掉,即把sum赋值为零,并且将记录子序列起始位置的变量值修改为当前数组索引位置的下一个位置。

4.遍历结束后,输出结果{max,start,end}

上述算法的时间复杂为O(n),即在线性时间内可完成作业。

算法实现1

MaxSeq01

实现1存在的问题

我使用了一些测试用例对上述实现进行了测试。其中,当array = {-1,0,0}时,程序的输出为(max,start,end) = (-1,0,2),很明显并未通过该次测试。在第20行添加一个断点,对其进行调试。在调试的过程发现:在第一轮循环过程中,因为(sum,max)=(-1,-1),所以判定分支将进入路径P1={23-24-25-26-27-28-34},可以发现这一过程没有移动起始标志的操作,也没有将sum置为零的处理。这样一来,在接下来的几轮循环中,程序的控制逻辑将始终不会进行判定分支路径P2={29,30,31,32,33},从而记录起始位置的变量将始终不会发生变化。而事实上,在完成第一轮循环时,记录子序列起始位置的变量的值就应该增一,即向后移动一位。

算法实现2

在算法实现1的基础上进行改进。橙色矩形中为新增代码。

MaxSeq02

加入新的代码后,在array = {-1,0,0}时,程序的输出为(max,start,end) = (0,1,2)。问题解决!!!

测试用例执行情况

下面列举了算法实现1与实现2的测试情况表。

MaxSeqTestResult

上表中的12个测试用例基本通过。在表中可以看到测试用例TC8的实际结果与预期结果不一致。经过分析,如果程序达到完美输出的话,应该将满足最大值条件且长度相同的子序列全部输出,但是因为当前实现的程序只能输出一个结果值,因此还是有可改进空间的。

总结

经过课堂上的这次小测验,感觉以前学习到的知识单从文字上来说,好像已经明白了,但实际上只是理解了主线上的内容。当亲自动手将它转换成实际代码时,却发现还有许多细节之处没有掌握,这也许就是与他人存在差距的地方,也是需要弥补的地方。

这里特别感谢TA周智毅,及时、准确地发现了程序中的缺陷!特此感谢!

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值