news 2026/8/12 17:00:09

python hot 100——4 动态规划

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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]
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/12 16:57:01

网页Java不是玄学,是跟电脑说人话!你还在门外干瞪眼?

Java是一种计算机语言, 其用途是开发软件, 这就好比汉语是在中国用于交流的语言, 西班牙语是在西班牙用于交流的语言, 编程要适合与计算机沟通就得使用计算机能认识的语言, 那么Java正是其中之一, 接下来会按顺序进行介绍:软件开发软硬件介绍软件开发软件开发, 是这…

作者头像 李华
网站建设 2026/8/12 16:55:31

Vue.js网页终端组件vue-web-terminal:从仿真到实战的完整指南

1. 项目概述:为什么我们需要一个网页终端? 在开发一个现代化的Web应用,尤其是面向开发者的工具平台、在线IDE、运维监控后台或者云服务控制台时,我们常常会遇到一个需求:如何在浏览器里直接运行命令行?想象…

作者头像 李华
网站建设 2026/8/12 16:54:41

Linux基础:进程概念

文章目录🚀 吐血整理!小白也能秒懂的 Linux 进程概念大揭秘(硬核详细版)1. 祖师爷的宝训:冯诺依曼体系结构1.1 硬件的“权力游戏”2. 计算机里的大管家:操作系统 (OS)2.1 操作系统是个啥?2.2 管…

作者头像 李华
网站建设 2026/8/12 16:52:53

基于VSCode与Zephyr RTOS的STM32F103C8T6开发环境搭建与实战

在嵌入式开发领域,Zephyr RTOS 以其模块化、高度可配置和跨平台特性,正成为越来越多开发者的选择。然而,对于习惯了传统 IDE(如 Keil、IAR)的 STM32 开发者,尤其是使用 STM32F103C8T6 这类经典“蓝桥杯”最…

作者头像 李华