LeetCode 题目 120:三角形最小路径和

作者介绍:10年大厂数据\经营分析经验,现任字节跳动数据部门负责人。
会一些的技术:数据分析、算法、SQL、大数据相关、python,欢迎探讨交流
欢迎加入社区:码上找工作
作者专栏每日更新:
LeetCode解锁1000题: 打怪升级之旅
python数据分析可视化:企业实战案例
漫画版算法详解
python源码解读
程序员必备的数学知识与应用

题目描述

给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。相邻的结点在这里指的是下一行中与这个结点正下方或者正下方右边的结点。

在这里插入图片描述

方法一:动态规划(自底向上)

解题步骤:
  1. 从三角形的最后一行开始,用一个数组 dp 存储到当前行每个元素的最小路径和。
  2. 对于三角形的每一行,更新 dp 数组中的每个值,使其等于当前元素加上它下面行中相邻元素的较小者。
  3. 最终,dp 数组的第一个元素将包含从顶部到底部的最小路径和。
Python 代码示例
def minimumTotal(triangle):dp = triangle[-1]for i in range(len(triangle) - 2, -1, -1):for j in range(len(triangle[i])):dp[j] = triangle[i][j] + min(dp[j], dp[j + 1])return dp[0]

方法一使用动态规划的自底向上方式来计算三角形的最小路径和。我们将通过 ASCII 图形来展示这个方法的工作过程,特别是如何迭代更新从底层到顶层的计算过程。

算法图解

考虑一个具体的三角形:

[[2],[3,4],[6,5,7],[4,1,8,3]
]

我们从三角形的最后一行开始,并逐行向上更新每个元素的最小路径和。

初始状态
  1. 初始化 dp 数组为三角形的最后一行:
dp: [4, 1, 8, 3]
更新到第二行
  1. 更新 dp 数组为倒数第二行的每个元素加上其下面行中相邻元素的较小者:
更新过程:
dp[0]: 6 + min(4, 1) = 6 + 1 = 7
dp[1]: 5 + min(1, 8) = 5 + 1 = 6
dp[2]: 7 + min(8, 3) = 7 + 3 = 10dp: [7, 6, 10]
更新到第三行
  1. 同理,更新 dp 数组为第三行的每个元素加上其下面行中相邻元素的较小者:
更新过程:
dp[0]: 3 + min(7, 6) = 3 + 6 = 9
dp[1]: 4 + min(6, 10) = 4 + 6 = 10dp: [9, 10]
更新到第四行(顶行)
  1. 最后更新顶行:
更新过程:
dp[0]: 2 + min(9, 10) = 2 + 9 = 11dp: [11]
结果
  • 自底向上的动态规划计算结束后,dp 数组的第一个元素 11 就是从顶部到底部的最小路径和。
总结步骤
  • 初始化 dp 数组为三角形的最后一行。
  • 从三角形的倒数第二行开始,向上逐行更新 dp 数组,每个元素都更新为自己加上下一行相邻两个元素中较小的一个。
  • 这个过程一直重复到三角形的顶部。
  • dp[0] 存储了最终的最小路径和。

方法二:递归 + 记忆化

解题步骤:
  1. 创建一个与三角形同样大小的 memo 数组,用于存储到每个元素的最小路径和,避免重复计算。
  2. 使用递归函数,从顶部开始计算每个元素到底部可能的最小路径和,将结果存储在 memo 中。
  3. 返回顶部元素的最小路径和。
Python 代码示例
def minimumTotal(triangle):memo = [[None] * len(row) for row in triangle]def helper(row, col):if row == len(triangle):return 0if memo[row][col] is None:memo[row][col] = triangle[row][col] + min(helper(row + 1, col), helper(row + 1, col + 1))return memo[row][col]return helper(0, 0)

方法三:动态规划(自顶向下)

解题步骤:
  1. 使用一个 dp 数组,初始化为三角形的第一行。
  2. 逐行更新 dp 数组,使每个元素代表从顶部到当前元素的最小路径和。
  3. 在遍历的过程中,注意边界元素的处理,因为它们只有一种选择。
  4. 最后一行中的最小值即为所求的最小路径和。
Python 代码示例
def minimumTotal(triangle):dp = triangle[0]for i in range(1, len(triangle)):prev = dp[:]for j in range(len(triangle[i])):if j == 0:dp[j] = prev[j] + triangle[i][j]elif j == len(triangle[i]) - 1:dp[j] = prev[j - 1] + triangle[i][j]else:dp[j] = min(prev[j - 1], prev[j]) + triangle[i][j]return min(dp)

算法分析

  • 时间复杂度
    • 方法一和三:(O(n^2)),其中 (n) 是三角形的行数。
    • 方法二:理论上也是 (O(n^2)),但由于递归调用栈的开销,可能会慢一些。
  • 空间复杂度
    • 方法一和三:(O(n)),仅使用了一维数组进行存储。
    • 方法二:(O(n^2)),使用了一个全尺寸的备忘录数组加上递归栈。

不同算法的优劣势对比

  • 动态规划(自底向上)(方法一)非常直观和高效,通常是解决此类问题的首选方法。
  • 递归 + 记忆化(方法二)易于理解和实现,但空间消耗较大。
  • 动态规划(自顶向下)(方法三)保持了问题的自然顺序,易于理解,但在边界处理上稍微复杂一些。

应用示例

这种类型的最小路径问题在图形路径计算、资源优化分配及其他需要最优决策的领域有广泛的应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1420643.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Linux提权--第三方软件MYSQL数据库提权(WEB+本地)

免责声明:本文仅做技术交流与学习,非法搞事后果自负... 目录 靶场镜像: 过程: 手工: 下载mysql udf poc 进行编译. 进入数据库进行UDF导出 下载(上传) 创建do_system函数调用 探针(./LinEnum.sh),查找suid权限. 配合使用find调用执行 工具: 过程: 外连不上? 隧道出…

矿用光缆型号和规格

管道矿用光缆生产厂家,矿用光缆特点是什么,矿用通信光缆 矿用光缆 MGTS光缆的结构是将250 m光纤套入高模量材料制成的松套管中,松套管内填充防水化合物。缆芯的中心是一根金属加强芯,对于某些芯数的光缆来说,金属加强…

K-RTD01和利时FW248中控卡件

K-RTD01和利时FW248中控卡件。 系统概述 的全称为保护工程师站及录波分析后台”是利用现代计算机和网络技术,K-RTD01和利时FW248中控卡件。实时收集变电站运行和故障信息,并通过对变电站的故障信息进行综合分析,K-RTD01和利时FW248中控卡件。…

并发编程实现

一、并行编程 1、Parallel 类 Parallel类是System.Threading.Tasks命名空间中的一个重要类,它提供数据并行和任务并行的高级抽象。 For和ForEach Parallel类下的For和ForEach对应着普通的循环和遍历(普通的for和foreach),但执行时会尝试在多个线程上…

Python中bisect模块

Python中bisect模块 在Python中,如果我们想维持一个已排序的序列,可以使用内置的bisect模块,例如: import bisect# 用于处理已排序的序列 inter_list [] bisect.insort(inter_list, 3) bisect.insort(inter_list, 2) bisect.in…

python3 Fatal error in launcher: Unable to create process using

python 环境变量 在window系统环境变量 path 中配置 python 的安装目录,目录层级至paython 的安转目录即可。 pip环境变量配置 在path 中增加配置 paython 安装目录下 Scripts 子目录的环境变量。 以上配置完成后,win R 打开命令窗口,输…

汽车商城系统

文章目录 汽车商城系统一、系统演示二、项目介绍三、部分功能截图四、部分代码展示五、底部获取项目源码(9.9¥带走) 汽车商城系统 一、系统演示 汽车商城 二、项目介绍 该汽车商城系统主要分为前台和后台两大功能模块,共包含两种…

利用“AnaTraf“网络流量分析仪轻松诊断和优化网络

网络性能监测和诊断(NPMD)是网络管理和优化的重要环节,准确快速地定位和排除网络故障对于保障业务正常运转至关重要。作为一款专业的网络流量分析设备,AnaTraf网络流量分析仪凭借其强大的流量分析和故障诊断功能,为网络管理者提供了一个高效的网络优化解决方案。 全面掌握网络…

【C++】————类与对象(上)-基础知识

目录 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 类的两种定义方式: 成员变量命名规则的建议: 4.类的访问限定符及封装 4.1 访问限定符 ​编辑 【面试题】问题:C中struct和class的区别是什么? 4.2 封装 【面试…

ipa 功能包调试,分区算法,覆盖算法测试

参考 wiki 流网络 flow network 解释 相关文章 ipa 分区算法 ipa 分区算法总结,部分算法图解 环境 ubuntu20,ros 版本 noetic 运行测试 按照 readme 提示进行测试,跳过第一个步骤,并不需要 turtlebot3。 执行第三个 launch 报…

【计算机网络篇】数据链路层(10)在物理层扩展以太网

文章目录 🍔扩展站点与集线器之间的距离🛸扩展共享式以太网的覆盖范围和站点数量 🍔扩展站点与集线器之间的距离 🛸扩展共享式以太网的覆盖范围和站点数量 以太网集线器一般具有8~32个接口,如果要连接的站点数量超过了…

17_基于Flash和RAM的的文件系统选择

嵌入式系统常见文件系统 本文主要讲述在嵌入式系统中,常见的基于flash和内存(RAM)的文件系统类型,具体选择要结合实际需求灵活选配。 一、基于 Flash 的文件系统 基于 Flash 的文件系统主要包括 JFFS2、 YAFFS、 Cramfs 和 Romfs 等,各种文件系统具有不同的特点,本文将分…

数据结构-二叉树-红黑树

一、红黑树的概念 红黑树是一种二叉搜索树,但在每个节点上增加一个存储位表示节点的颜色,可以是Red或者BLACK,通过对任何一条从根到叶子的路径上各个节点着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,…

人工智能生成图像的兴起:区分事实与虚构

人工智能生成图像的兴起:区分事实与虚构 概述 在人工智能 (AI) 已融入我们日常生活的时代,人工智能生成图像的快速发展引发了人们对数字内容真实性的担忧。最近,人工智能生成的图像甚至欺骗了最敏锐的眼睛,这引发了人们对批判性…

饥荒服务器搭建centos

服务器环境需要64位32位不可用 uname -r 查看服务器版本 更新yum sudo yum update 安装依赖环境 sudo yum -y install glibc.i686 libstdc.i686 libcurl4-gnutls-dev.i686 libcurl.i686 screen 安装steam cd /home && mkdir steamcmd && cd steamcmd 国…

动态规划算法练习——计数问题

题目描述 给定两个整数 a 和 b,求 a 和 b 之间的所有数字中 0∼9 的出现次数。 例如,a1024,b1032,则 a 和 b 之间共有 9 个数如下: 1024 1025 1026 1027 1028 1029 1030 1031 1032 其中 0 出现 10 次,1 出现…

创新指南|设计冲刺 – 更快找到成功的创新方案

“ 设计冲刺(Design Sprint)” 一词与跑步无关,而且不局限于设计,它与引导团队加速创新密切相关。设计冲刺旨在帮助创新团队在很短的时间内解决一个极有价值的问题。本文将深入解析这一法宝:设计冲刺是什么&#xff1f…

会声会影2024中文汉化补丁器附免费激活码序列号

会声会影是一款由加拿大Corel公司发布的视频编辑软件,它以其功能丰富和用户友好的界面而闻名。会声会影2024是该系列的最新版本,它不仅继承了之前版本的强大功能,还引入了一系列新的特性和工具,使得视频编辑更加简单、高效且富有创…

智慧安监中的物联网主机E6000

物联网主机E6000的研发背景主要源于我国对物联网技术在安全生产、环境监测、火灾预警与防控、人员定位与紧急救援等领域的迫切需求。近年来,随着物联网技术的飞速发展,我国政府对智慧安监的重视程度不断提升,相关的政策扶持力度也在加大。在这…

React 第二十七章 Hook useCallback

useCallback 是 React 提供的一个 Hook 函数,用于优化性能。它的作用是返回一个记忆化的函数,当依赖发生变化时,才会重新创建并返回新的函数。 在 React 中,当一个组件重新渲染时,所有的函数都会被重新创建。这可能会…