一个整数数组(正负,0),找出这个数组的最大子序列
来源:互联网 发布:ubuntu双系统引导界面 编辑:程序博客网 时间:2024/06/05 22:32
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
实现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的基础上进行改进。橙色矩形中为新增代码。
加入新的代码后,在array = {-1,0,0}时,程序的输出为(max,start,end) = (0,1,2)。问题解决!!!
测试用例执行情况
下面列举了算法实现1与实现2的测试情况表。
上表中的12个测试用例基本通过。在表中可以看到测试用例TC8的实际结果与预期结果不一致。经过分析,如果程序达到完美输出的话,应该将满足最大值条件且长度相同的子序列全部输出,但是因为当前实现的程序只能输出一个结果值,因此还是有可改进空间的。
总结
经过课堂上的这次小测验,感觉以前学习到的知识单从文字上来说,好像已经明白了,但实际上只是理解了主线上的内容。当亲自动手将它转换成实际代码时,却发现还有许多细节之处没有掌握,这也许就是与他人存在差距的地方,也是需要弥补的地方。
这里特别感谢TA周智毅,及时、准确地发现了程序中的缺陷!特此感谢!
- 一个整数数组(正负,0),找出这个数组的最大子序列
- 输入一个有正负整数的数组,寻找最大子数组
- 给定一个数组,找出这个和最大的连续子数组的和
- 一个正负数组,求其最大的连续子串和
- 关于正负整数数组的一个算法
- 一个包含正整数和负整数的数组,找出和最大的子串.
- 找出数组和最大的连续子序列
- 求一个数组的最大子序列
- 找出一个数组里边和最大的子数组,输出最大和和子数组
- 存在正负数数组的最大子数组和
- 求一个整数数组的子数组的最大和
- 找出最大子数组
- “一个数组有正负0,求和为0的最长连续子数组”的失败解法
- 找出连续子数组的最大和
- 找出连加值最大的子数组
- 在一个数组中找出和最大的一个连续的子数组串
- 计算一个数组中最大子序列的和
- 数组最大子序列
- “蓝牙是个金矿,将掀起新一轮技术淘金热!
- Linq to DataTable 合并相同的二个DataTable 且已重复的行不合并
- Ubuntu下的RabbitVCS
- 白话经典算法系列之六 快速排序 快速搞定
- 消息定义结构详解
- 一个整数数组(正负,0),找出这个数组的最大子序列
- windows资源管理器文件无法自动刷新
- git 打补丁
- linux 6.4 使用xmanager4 的配置
- 求一个数组中出现次数最多的数
- wmic用法示例
- Web编程技术点摘录(二)
- 驱动中的宏定义
- [C#] Winform 中打开超链接