Leetcode53:最大子序和(简单题)python3

该博客介绍了LeetCode第53题的解决方案,即寻找整数数组的最大子序列和。通过示例数组[-2,1,-3,4,-1,2,1,-5,4],博主展示了如何在O(n)的时间复杂度内找到最大和,避免了暴力求解导致的时间超限。思路是使用动态规划,从数组第一项开始,以当前项为结束点,计算前面连续项的和,并存储在每一项位置,更新最大和。" 39253547,1323853,Windows系统DLL文件安全配置,"['系统安全', 'Windows设置', 'DLL修改', '防病毒', '系统防护']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-subarray
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:经过前面做题的一系列经验,暴力解法不可取(即循环迭代求出所有的子数组的和然后比较求出最大的,这会超过时间限制,且时间复杂度和空间复杂度都较高);考虑复杂度为O(n)的方法,即只进行一次循环,从第一项开始,以它为最后一项计算前面连续项的和,将连续的和存储到每一项的位置,这样计算下一项连续和时仅需考虑上一项,比如,第一项就为它本身,第二项开始时比较第一项与0的大小,若第一项比0大,那么第二项即为第二项本身的值,以此类推;

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        n=len(nums)
        for i in range(1,n):
            nums[i]=nums[i]+max(nums[i-1],0)

        return max(nums)

如果对上面的代码无法理解可以看看下面这一part:初始的求和变量记为s,将s加上下一个元素与下一个元素进行比较,如果s加上它更大的话就更新s,如果不是,这时的序列就从新的nums[i]开始,用result记录函数的结果。

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        n=len(nums)
        s=nums[0]
        result=s
        for i in range(1,n):
            s=max(s+nums[i],nums[i])
            result=max(result,s)
        return result
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值