【刷题笔记】53. 最大子数组和

112 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情

一、题目描述:

53. 最大子数组和 - 力扣(LeetCode) (leetcode-cn.com)

给你一个整数数组 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 <= 10^5
  • -10^4 <= nums[i] <= 10……4  

进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的 分治法 求解。

二、思路分析:

我们可以把这个问题分成两种情况:

  1. 数列全为负数,最大子序和就是负数中的最大值。 所以在遍历数组的时候,不断记录最大值,便于最后比较。
  2. 数列不全为负数,我们可以采用动态规划的方法遍历一遍列表。 遍历的过程中,先把子序和为正数计为中间值:一旦子序和为负数,中间值重置为0。过程中记录下最大的中间值。
  3. 比较数列的最大值可以判断是哪一种情况,并进行输出。

三、AC 代码:

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        Max=0,n=len(nums),This=0,ans=nums[0]
        #初始值得设置
        for i in range(n):
            This+=nums[i]
            ans=max(ans,nums[i]) #数列中的最大值
            if This>Max:
                Max=This #记录遍历过程中的最大子序和
            if This<0:
                This=0 #子序和为负,重置为0
        if ans<=0:
            return ans #情况1,全为负数,取最大值
        else:
            return Max #情况2,不全为负数

范文参考:

最大子序和 c++实现四种解法 暴力法、动态规划、贪心法和分治法 图示讲解 - 最大子数组和 - 力扣(LeetCode)