给定一个整数数组 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用来保存最大子序和。
- 具体原因解释如下:
对于含有正数的序列而言,最大子序列肯定是正数,所以头尾肯定都是正数.我们可以从第一个正数开始算起,每往后加一个数便更新一次和的最大值;当当前和成为负数时,则表明此前序列无法为后面提供最大子序列和,因此必须重新确定序列首项.