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 之前的数值之和只要是负数,那么对后面的求和没有增益(面积会减小),那么就将前面的和置零,如果前面求和不为零,那么就对后面面积的增大有增益,此时保留求和。