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

python hot 100——4 动态规划

53. 最大子数组和

1. 📖 题目要求

给你一个整数数组nums,找出和最大的连续子数组,返回这个子数组的元素和。

例如:

  • 输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
  • 输出:6
  • 和最大的连续子数组是: [4,-1,2,1]
  • 它的和为:4 + (-1) + 2 + 1 = 6

2. 💡 整体思路

定义数组:f[i]

表示:

必须以nums[i]结尾的最大子数组和。

对于当前数字nums[i],有两种情况:

  1. 接在前面的子数组后面。
  2. 不要前面的部分,从当前数字重新开始。

状态转移公式

f[i] = max(f[i - 1], 0) + nums[i]

如果f[i-1]

  • 大于0:保留前面的子数组。
  • 小于0:前面的部分会拖累结果,直接丢掉。

初始条件

f[0] = nums[0]

最终答案:

max(f)

因为最大子数组不一定以最后一个数字结尾。

✏️ 示例

nums = [-2, 1, -3, 4, -1, 2, 1, -5, 4]
inums[i]f[i]
0-2-2
111
2-3-2
344
4-13
525
616
7-51
845

f中的最大值是6


3. ✅ 可以直接运行的完整程序

class Solution(object): def maxSubArray(self, nums): n=len(nums) f = [0] * n f[0] = nums[0] for i in range(1, n): f[i] = max(f[i - 1], 0) + nums[i] return max(f) text = raw_input("请输入数组:") nums = map(int, text.split()) solution = Solution() answer = solution.maxSubArray(nums) print "最大子数组和是:", answer

4. 🛠 超详细代码逐行讲解

class Solution(object): def maxSubArray(self, nums): n=len(nums) f = [0] * n # 创建和nums长度相同的动态规划数组 #初始状态 f[0] = nums[0] # 以第一个数字结尾时,只能选择第一个数字 for i in range(1, n): # 遍历数组下标,从1到最后 #状态转移方程 f[i] = max(f[i - 1], 0) + nums[i] # 如果前面的和大于0,就保留前面的部分 # 如果前面的和小于0,就从当前数字重新开始 return max(f) # 返回f数组中的最大值

核心状态转移方程

f[i] = max(f[i - 1], 0) + nums[i]

例如当前数字是4,前面的最大和是-2

f[i] = max(-2, 0) + 4 = 0 + 4 = 4

前面的和是负数,所以从4重新开始。

①为什么不能for i in f:

for i in f:

这里的if中的元素值,不是下标。

这道题需要通过下标访问:

f[i - 1] # 前一个状态 nums[i] # 当前数字 f[i] # 保存当前状态

5. 📚 本题用到的 Python 基础知识总结

知识点用法解释
列表f = [0] * len(nums)创建指定长度的列表
列表长度len(nums)获得数组长度
for循环for i in range(1,n)从1到n-1遍历
rangerange(a, b):从a开始,到b-1结束左闭右开

6. 🚨 易错点提醒

易错点原因正确做法
f[0]初始化为0子数组不能为空f[0] = nums[0]
循环从0开始会访问f[-1]i = 1开始
返回f[-1]最大子数组不一定以最后一个数字结尾返回max(f)
把子数组当成子序列子数组中的元素必须连续只能与前一个状态拼接
前面的和为负数还保留负数会拖累当前结果使用max(f[i-1], 0)
答案初始化为0数组可能全部是负数使用f[0] = nums[0]
http://www.jsqmd.com/news/1379718/

相关文章:

  • 湖州热门烘焙面包培训机构|港焙学校真实测评 - 港焙西点-知美人美学
  • 3天让你的安卓手机脱胎换骨:Universal Android Debloater 终极优化指南
  • 猫抓浏览器扩展:三步轻松抓取网页视频资源的终极指南
  • 湖南省选武校看这篇就够了|洪江市、冷水江市、涟源市、吉首市文武学校口碑实力汇总 - 圣龙武术朱老师
  • 2026台式RFID和条码打印机行业分析:双模识别技术如何驱动工业标识升级?
  • PyQt5安装失败全解析:从VC++编译到.whl轮子解决方案
  • Sticky:Linux桌面便签的终极解决方案,让数字灵感永不丢失
  • AI音乐生成与音频分析技术:从重型金属吉他到自动化音乐处理实践
  • 2026年阜新新媒体运营推广合规服务商中网创信怎么选?服务体系、内容协同与避坑指南 - 中国远见品牌企业资讯
  • 商业综合体地下车库反向寻车,千万别盲目上蓝牙AOA!
  • Nemotron 3.5 Lightning + NeMo Switchyard深度解析:30B MoE仅3B活跃参数,从蒸馏到路由的AI Agent执行层新范式
  • 2026广东成人高考|财大全新专业调整,上班族升本优选 - 湖北找学校
  • 小白也能学会!如何远程访问公司内网的 FastAPI 服务
  • 从Function Calling到MCP:构建安全可控的生产级AI Agent系统
  • 9款必备MCP Server配置指南:解锁Cursor AI私有数据访问与效率革命
  • 如何系统评估与淘到高价值周边模型:从信息搜集到真伪鉴别全流程
  • 2026年涿州钻石回收怎么选靠谱商家?(185-3117-2838)火炬路204赵掌柜二奢店实体门店规范鉴定指南 - 赵掌柜二奢
  • Pygame性能优化:脏矩形技术原理、实战与避坑指南
  • Spring IoCDI
  • OFD文件预览方式详解(在线预览),采用异步加载OFD文件实现在线预览解析ofd文件 - usdoc
  • Windows GDI文本绘制:TextOut与DrawText的核心原理与实战选择
  • 远程联机软件推荐 远程联机用哪个软件好
  • G-Helper风扇曲线精准调校:华硕笔记本散热性能深度优化指南
  • 2026年湛江安防监控与弱电机房,办公网络怎么建? - LYL仔仔
  • 企业媒体发稿怎么做好AI收录沉淀?传播易智能投放解决方案
  • Java泛型核心:类型变量<T>与通配符<?>的本质区别与实战应用
  • 研发费用中“材料费硬塞”的识别方法——基于领料单与实验记录交叉验证的实务操作指南
  • LangChain Agent企业级实战:从零构建智能数据分析助手
  • 2026法律案例库:腾讯ima搭建实践 - 领先技术探路人
  • 品牌出海如何做好海外传播?朝闻通全域媒体发稿有哪些优势?