Leetcode 53. 最大子数组和
Kadane算法:
这里我用到的算法是kadane算法,这是一种比较普遍的算法用来解决最大值在子数组中的问题,例如本题和最大子数组乘积之类的问题
他的核心思想是这样的,我们在遍历数组的时候,我们会记录两个值,一个是当前subarray的和,还有当前subarray的起始点,并且我们保证这个过程中,我们的subarray一定是在朝着会变大的方向在走,也就是像这张图中画的一样,我们一开始当然会把-2归到数组中,但是当我们遇到1之后,我们新的数组应该直接放弃-2然后从1开始,并且这时cur_sum是等于1的,然后再遇到-3的时候,因为我们这时的cur_sum其实是正数,所以我们不知道要不要算上3,(尽管这时我们知道算上3会使cur_sum变成-2,但是algorithm不知道)也许减去3之后再加上3后面的一个较大的正数可以给我们一个sum更大的subarray所以我们在红色的subarray里算上3,但是算上之后我们重新calculate的cur_sum我们发现变成了-2,这时我们遇到了4,然后就是这个算法的另一个关键点,就是当我们的cur_sum是一个负数的时候,无论遇到的新数字是什么,我们都应该直接放弃当前这个subarray把新遇到的这个数字当做新的subarray的起点,因为如果新数字是一个负数,那反正加上他只会让我们的sum变得更小,如果是个正数那当然更好了,所以这里变成了4并且一直保持着到最后,然后我们只需要在每个循环中用cur_sum update最大值就可以了
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
# create the sum and res variable
cur_sum = 0
res = float('-inf')
for num in nums:
if cur_sum < 0:
cur_sum = num
else:
cur_sum = cur_sum + num
res = max(res, cur_sum)
return res