Leetcode热题100:普通数组

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

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值