53. 最大子序和(easy)

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

  • show the code:
class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        res,s = nums[0],0
        for num in nums:
            s = s+num if s > 0 else num
            res = max(res,s)
        return res
  • 此题属于动态规划,我之前面试小米时被问到过(虽然没做出来)关键的状态转移式为:
    dp[i] = max(dp[i-1]+nums[i],nums[i])
  • 其中dp[i]为到索引i位置时的最大子序和,写出这个方程了,代码就随便写了,你可以把每次的res结果都保存起来,最后返回最大值,也可以维护一个summ每次都和res来比,取出最大者,但是这个俩都没上面代码快。
  • 上面代码的关键是维护了一个s,可以代表当前的子序和,如果s大于0,说明可以把s加到后面的序列中,反之如果小于等于0,我们完全可以舍弃这个s,将s赋成下一个num即可,res用来保存最大子序和。
  • 具体原因解释如下:

对于含有正数的序列而言,最大子序列肯定是正数,所以头尾肯定都是正数.我们可以从第一个正数开始算起,每往后加一个数便更新一次和的最大值;当当前和成为负数时,则表明此前序列无法为后面提供最大子序列和,因此必须重新确定序列首项.

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