LeetCode 53. 最大子数组和|Python 解法详解

LeetCode 53. 最大子数组和|Python 解法详解

CSDN 算法专题 · 动态规划 | 难度:中等

题目信息

题目描述

给定整数数组,找出和最大的非空连续子数组并返回其和。

示例

text 复制代码
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:[4,-1,2,1] 的和最大。

约束

1 ≤ nums.length ≤ 10⁵;-10⁴ ≤ numsi ≤ 10⁴。

解题思路

核心观察

定义 cur 为"必须以当前位置结尾"的最大和。它要么从当前元素重新开始,要么接在前一状态后;全局答案取所有 cur 的最大值,这就是 Kadane 算法。

推导与执行步骤

  1. 用首元素初始化 cur 和 best
  2. 计算 cur=max(x,cur+x)
  3. 用 cur 更新 best
  4. 遍历结束返回 best

为什么这个方法正确

算法始终围绕上述核心观察维护有效状态,并且每一步只排除已经能够证明不可能产生更优答案的情况。按照执行步骤处理后,所有可能影响答案的元素或节点都会被恰好检查,因此不会遗漏合法答案;状态更新又严格遵守题目约束,所以最终结果有效。

从边界看,空区间、单个元素、全部相同或完全不匹配等情况都会落入初始化条件或循环终止条件,不需要依赖未定义状态。实现时再重点检查下标、空节点和重复元素,即可保证算法在极端输入下仍然成立。

Python 代码

python 复制代码
# 解法核心:定义 cur 为"必须以当前位置结尾"的最大和。它要么从当前元素重新开始,要么接在前一状态后;全局答案取所有 cur 的最大值,这就是 Kadane 算法。
# 实现步骤:
# 1. 用首元素初始化 cur 和 best
# 2. 计算 cur=max(x,cur+x)
# 3. 用 cur 更新 best
# 4. 遍历结束返回 best

class Solution:

    def maxSubArray(self, nums: list[int]) -> int:
        max_sum = nums[0]  # 记录遍历过程中出现的最大答案
        cur_sum = nums[0]  # 记录必须以当前位置结尾的最大连续和
        for i in range(1, len(nums)):
            cur_sum = max(nums[i], cur_sum + nums[i])  # 记录必须以当前位置结尾的最大连续和
            max_sum = max(max_sum, cur_sum)  # 记录遍历过程中出现的最大答案
        return max_sum

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

易错点

不能把初值设为 0,否则全负数组会得到错误答案。

总结

这道题的关键是:定义 cur 为"必须以当前位置结尾"的最大和。理解这一点后,再结合边界条件检查,代码就能保持清晰且稳定。

相关推荐
lumengabc7 分钟前
视频制作文字转语音PPT台词生成合成合并视频导出ffmpeg软件python edge-tts
python
秋天的怀念_David9 分钟前
听故事学语言 · 数据结构篇 · 序章一 算法之问
数据结构·程序人生·算法
MSTcheng.11 分钟前
Agent 跑到一半崩了,怎么从上一步接着跑?LangGraph StateGraph 实战:状态持久化、断点恢复与人工审批
python·状态管理·ai agent·langgraph·断点恢复·人工审批
略略略咯咯14 分钟前
33333
开发语言·windows·python
LG.YDX14 分钟前
基于中心的3D目标检测和探索追踪-笔记
笔记·算法·目标检测
java_prinln14 分钟前
11. 说说 Single-Agent 和 Multi-Agent 的设计方案?
python
垆边人似月.17 分钟前
第三篇:函数、文件与异常处理 / Functions, Files & Exception Handling
开发语言·python
我的xiaodoujiao19 分钟前
Django 权限系统项目实战详细图文教程 4--系统登录功能实现 2
后端·python·django
民乐团扒谱机20 分钟前
【读论文】音色在微分音程记忆中的作用
人工智能·深度学习·算法
鬼手点金22 分钟前
缓存作为架构约束
开发语言·前端·人工智能·python·microsoft·缓存·架构