最大子数组和

文章讨论了如何在给定整数数组中找到具有最大和的连续子数组。介绍了两种方法:贪心算法通过判断当前元素与之前和的关系,以及动态规划方法,通过累加和更新全局最大值。

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组是数组中的一个连续部分。

示例 1:

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

输入:nums = [1]
输出:1
示例 3:

输入:nums = [5,4,-1,7,8]
输出:23

提示:

1 <= nums.length <= 10510^5105
-10410^4104 <= nums[i] <= 10410^4104

思路看leetcode官方视频讲解:

class Solution:
    def maxSubArray(self, nums: list) -> int:
        #贪心解法: 如果当前元素之前的和小于0,那么就应该丢弃,否则加上当前元素
        maxsum, presum = -10000, -10000
        if len(nums) == 1:
            return nums[0]

        for i in nums:
            if presum < 0:
                presum = i
            else:
                presum += i

            maxsum = max(maxsum, presum)
        return maxsum

    def maxSubArray(self, nums: list) -> int:
        #动态规划:如果前一个元素大于0,把它加到当前元素上
        if len(nums) == 1:
            return nums[0]

        maxsum = nums[0]
        for i in range(1,len(nums)):
            nums[i] = max(nums[i], nums[i] + nums[i-1])
            maxsum = max(nums[i], maxsum)
        return maxsum

贪心解法在这道题上比较容易理解,但也有一个点就是需要设着两个变量:一个记录最大值,一个记录当前的和。想一下,前面一个连续数组的和很大,但是遇到了一个更大的负数,导致和小于等于0,当重新开始计数后,后边的数组和不一定比前面的大,所以需要两个变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值