Find the contiguous subarray within an array (containing at least one number) which has the largest sum.

For example, given the array [−2,1,−3,4,−1,2,1,−5,4],
the contiguous subarray [4,−1,2,1] has the largest sum = 6.

 

本题目的数学模型其实就是一个求和或者是求积分面积的一个模型

上图为一个微积分的几何模型,我们在计算微积分的时候可以利用求和的方法来进行近似。

本题可以利用这个模型来求解。

首先,我们将数组中的每一个元素都看成上图中的一个竖条,正数代表着y(xn)>0,负数表示y(xn)<0,0则无关紧要。

下面我们就将一个求和问题转换成了一个求面积的问题,而主要的方法则是,利用负数作为分割线(这样就分为了一个一个的小面积),从第一个面积开始“吞”下负面积,如果总面积不为0,则对后面面积有增益的作用,否则我们便舍弃之前的面积(都是负面积,还不如重新计算),每次计算的时候我们将最大值与我们当前面积比较,记录一下最大值。这样当数组遍历完成,我们的最大面积也就计算好了,也就是题目中要求我们求得的最大和。

值得注意的是,有可能出现全部是负数的情况,所以我们需要假设改数组全部是负数,讲数组分成两段进行遍历,第一段作为假设为负数的遍历,当找到正数的时候(也就是说明面积肯定是正数拉),开始第二段迭代,由于两段没有交集,所以复杂度还是O(N)

 

我们可以看到在下标为 i 时(此时值负数),在 i 之前的数值之和只要是负数,那么对后面的求和没有增益(面积会减小),那么就将前面的和置零,如果前面求和不为零,那么就对后面面积的增大有增益,此时保留求和。

posted on 2015-06-18 23:00  Archer-Coder  阅读(105)  评论(0编辑  收藏  举报