当前位置: 首页 > news >正文

LeetCode 53. Maximum Subarray 题解

LeetCode 53. Maximum Subarray 题解

题目描述

给你一个整数数组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

解题思路

方法:动态规划

思路

  • 定义dp[i]为以nums[i]结尾的最大子数组和
  • 状态转移方程:dp[i] = max(nums[i], dp[i-1] + nums[i]),即要么当前元素自己作为一个子数组,要么与前面的子数组合并
  • 最终结果为max(dp)

复杂度分析

  • 时间复杂度:O(n),其中 n 是数组的长度。只需要遍历数组一次。
  • 空间复杂度:O(n),需要一个长度为 n 的数组来存储状态。

方法:动态规划(空间优化)

思路

  • 观察到dp[i]只依赖于dp[i-1],因此可以使用一个变量来存储前一个状态,不需要使用数组
  • 初始化current_sumnums[0]max_sumnums[0]
  • 遍历数组从第二个元素开始:
    • current_sum = max(nums[i], current_sum + nums[i])
    • max_sum = max(max_sum, current_sum)

复杂度分析

  • 时间复杂度:O(n),其中 n 是数组的长度。只需要遍历数组一次。
  • 空间复杂度:O(1),只需要常数级的额外空间。

代码实现

方法:动态规划

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

方法:动态规划(空间优化)

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

测试用例

测试用例 1:

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6

测试用例 2:

输入:nums = [1]
输出:1

测试用例 3:

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

测试用例 4:

输入:nums = [-1,-2,-3,-4]
输出:-1

总结

本题是动态规划的经典问题,主要考察对状态定义和状态转移方程的理解。两种方法各有特点:

  • 动态规划:代码清晰易懂,逻辑明确,但需要 O(n) 的空间。
  • 动态规划(空间优化):空间复杂度为 O(1),更高效,适用于大规模数据。

在实际应用中,空间优化的方法通常是首选,因为它不仅空间效率高,而且代码简洁。

这种方法不仅适用于最大子数组和问题,还可以应用于许多其他需要动态规划解决的问题,例如最大乘积子数组、最长递增子序列等。掌握动态规划的思想,对于解决这类问题非常重要。

http://www.jsqmd.com/news/571460/

相关文章:

  • STM32串口调试新姿势:用printf实现彩色日志分级(附完整代码)
  • 实战指南:基于快马AI开发企业级Web文件管理器,替代传统FTP客户端
  • 替代木托盘的终极方案:HDPE一体成型吹塑托盘核心厂商一览 - 深度智识库
  • 因信息获取受限暂无法生成准确标题
  • 分组网络频率同步互通测试
  • 别再手动配网了!用ChatGPT-4和ChatNet框架,5步搞定智能网络规划
  • 别再手动改材料了!用SIwave Wizard一键统一Allegro PCB的FR-4参数(附频变曲线设置)
  • Deep-Live-Cam实时换脸工具:从故障排除到高级应用全指南
  • 2026年云南化妆培训有什么特色,美甲美睫培训服务价格如何 - myqiye
  • 告别大模型幻觉!RAG 原理 + Spring AI 代码实现一步到位
  • 基于SpringBoot + Vue的养老院管理系统(角色:家属、护工、管理员)
  • FLUX.小红书极致真实V2LoRA微调原理:Adapter层注入与风格解耦机制
  • OpenStack
  • 2026深圳产品摄影和视频制作公司测评 本地前五推荐 - 速递信息
  • LeetCode 128. Longest Consecutive Sequence 题解
  • Ollama 加载自定义 GGUF 模型的实战指南
  • 零域名部署实战:阿里云ECS与宝塔面板的IP直连建站指南
  • ChatGPT_JCM前端性能预算:如何为AI聊天应用设定与实现性能目标
  • 2026年装配式建筑优选指南:探寻打包箱房/民宿箱式房酒店/轻钢结构厂房/活动房/集装箱生产的实力厂商 - 深度智识库
  • 基于SpringBoot + Vue的学生学习成果管理平台
  • 2026四川国开报名培训:国开报名与考公、成人自考形成黄金三角 - 深度智识库
  • 忍者像素绘卷企业落地案例:独立游戏工作室像素资源提效50%
  • 告别重复劳动:用快马生成deerflow式工作流,提升开发效率十倍
  • WarcraftHelper:魔兽争霸III性能优化终极指南 - 10分钟打造完美游戏体验
  • OBS智能背景移除插件:无绿幕实时抠图与低光增强完整指南
  • 告别重复造轮子:用快马AI一键生成蓝桥杯单片机高效开发模块库
  • OpenArm开源机械臂:7自由度机器人平台技术实现深度解析
  • 5分钟掌握微信聊天记录永久保存技巧:让每一段对话都有迹可循
  • 关于 SQLite 数据库的基础说明及优点介绍
  • 2026年工业网闸厂家TOP推荐:安全隔离网闸/物理隔离网闸/国产化网闸/危化网闸,技术实力与市场口碑深度解析 - 品牌推荐用户报道者