连续子数组的最大和

题目:

       输入一个整形数组,数组里有正数也有负数。
       数组中连续的整数组成一个子数组,每个子数组都有一个和。
       求所有子数组的和的最大值。要求时间复杂度为O(n)。

结对思路分析讨论

      题目,有些不知题目所云,再读题目才知道是求最大子数组的和,于是最先想到的是以数学的形式描述问题,假设数组个数为N,数组元素分别为a1,a2,a3,a4,a5......an.但是加上另一个数时,和可能增大,可能减小,而且即便和是减小的,又不能因此就把此数作为子数组的尾元素,因为后面的数可能超过原来已有数的和,也就是整个数组中,任何数的出现都是没有规律可循的,那么该怎么找出最大的子数组呢?

      于是向队友提出问题,队友解释的思路大体是这样的:限定子数组的个数,先假定每个子数组元素都是三个,分别a1,a2,a3;  a2,a3,a4;   a3,a4,a5;.....依次下去组成各个子数组比较其大小。

      稍作思考后,对子数组的定义与理解有些迷惑,想到数学中子集的概念,于是提出,如果限定了子数组的元素,那么是不是包括了所求整形数组的所有子数组呢?对方提出应该不能按照数学中的子集比拟,如果那样的话,各种情况很多而混乱,而且很难达到时间复杂度为O(n)的要求。

      那么该如何正确理解题目呢?经过双方再读题,再思考,才注意到并不是所有子数组,而是有限定的,就是连续子数组,这就大大减少了题目的复杂程度,也就是说,如果n=4,那么其所有子数组包括

<a1>,<a2>,<a3>,<a4>,<a5>,<a1,a2>, <a2,a3>,<a3,a4>,<a1,a2,a3>,<a2,a3,a4>,<a1,a2,a3,a4>。

      理解了题目,之后就是该怎样实现题目的要求,算法是怎样的。首先,如果使用穷举法的话,那么情况还是很复杂,而且很难实现时间复杂度为O(n)的要求。于是我们

从简单的地方开始分析思考查阅资料。当加上一个正数时,和会增加;当我们加上一个负数时,和会减少。如果当前得到的和是个负数,是不是可以在接下来的累加中重新清零呢?不然的话这个负数将会减少接下来的和。也就是我们可以使用一个变量t,并初始化为零。当t<0时,把t新赋值,置为下一个元素,t=a[i],当t不小于零时,继续累加下去,t>sum,则更新sum,否则不更新。这样就基本实现了题目的要求,至于是不是完全正确严密,还有子数组的各种情况分析,及结果测试还需要进一步的思考和完善。

 

备注:小组成员:刘丛欢_ 信1205_20122941
                       安帅_信1205_20122939
posted @ 2014-03-19 09:38  雨落星空的叶  阅读(285)  评论(0编辑  收藏  举报