最大子序和

题目如下所示:


题目

这道题可以使用滑窗的方法来进行暴力求解,把所有可能的结果都遍历一遍,然后取最大值。这种方法的时间复杂很高,且实现方法较为简单,故不提供该种方法的代码。
这道题更为精妙的方法是使用动态规划的方法来实现,可以大大降低时间复杂度,比上面的方法好多了。

动态规划的方法如下:
如果我们想要知道某个数组最大子序列之和,如[1,2,3],我们可以先求出[1,2]之和,然后在把结果加上3,这样就求出来了这个数组的和。如果数组是[1,-2,3],那么对于数组[1,-2]来说,他的和是-1,但是我们不会把这个-1和3相加来得到一个结果,因为[3]这个子序列的和明显大于整个子序列之和。
这样动态规划的基本实现方法就有了,通过对数组中某个元素之前的数组的加和情况进行判断,如果大于0,就把前面的结果加到这个元素中,表示这个数组对于求和这个操作来说是有收益的;如果小于0,则不把结果加上去,加个0,因为加上去对于求和而言不会带来增益,那从这里开始,就会重新开始记录新的子序和。

有了方法,代码也就很简单了。这种动态规划思想的代码简直是短到丧心病狂:

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        '''
        这是一种动态规划方法,对相当于从第1位开始对前面的数的结果进行加和并和0
        进行比较,如果比0大,说明有增益,这样就把前面的项加上,否则就把加上0,
        说明前面的项不会带来增益,会使总和变小,这样就从操作的那一项开始重新计数
        '''
        for i in range(1, len(nums)):
            nums[i] += max(0, nums[i-1])
        return max(nums)

操作过后的nums数组记录的是所有可能的子序列加和的加和结果,取一个最大值就能轻松得到结果了~

你可能感兴趣的:(最大子序和)