lintcode41 最大子数组

本文对比了两种实现最大子数组求和算法的代码,分析了错误代码中在判断子数组和是否小于0时的逻辑缺陷,并阐述了正确代码的思想,即在前一轮总和小于0时直接用当前值替换总和。

我的代码

    def maxSubArray(self, nums):
        total = 0
        i = 0
        maxnum = float('-inf')
        for i in range(len(nums)):
            if total + nums[i] < 0:
                total = nums[i]
            else:
                total += nums[i]
            if total > maxnum:
                maxnum = total
        return maxnum

正确代码

  def maxSubArray(self, nums):
        total = 0
        i = 0
        maxnum = float('-inf')
        for i in range(len(nums)):
            if total < 0:
                total = nums[i]
            else:
                total += nums[i]
            if total > maxnum:
                maxnum = total
        return maxnum

真所谓失之毫厘 谬以千里。虽然我和正确代码之前的差距只是在第一个if判断的时候有没有加上本轮的值nums[i],但是里面所体现的思想却是大不相同的。

我在if判断中加上用total + nums[i]再判断是否小于0所体现的思想是每次都判断本轮相加的和是否小于0,如果小于0就把本轮的值赋给total,但其实应该是把下一轮未知的值nums[i+1]赋给total用于判断才对,可这样却又会对for循环不友好(i不好更改)

最后看了一下正确代码,它在if判断的时候并没有加本轮的值,那么total代表的是之前轮的总和,之前轮的总和小于0 直接给total赋值新的本轮值nums[i]即可,无需再对i进行更改~

这一点小小的思想 希望自己能够多体会感受一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值