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.mzph.cn/bicheng/10888.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WEB后端复习——javabean与会话cookie、session

JavaBean 是一种符合特定命名约定的 Java 类,它通常用于封装数据。 JavaBean 的主要特点是: 1. 无参构造器:JavaBean 必须有一个公共的(public)无参构造方法,以便于反射时能够创建对象实例。 2. 属性&…

Android的视图显示和管理机制:layout view window WindowManager Canvas Surface

在Android系统中,Layout view window WindowManager Canvas Surface SurfaceFlinger这些组件协同工作,以实现图形的绘制和显示。需要搞明白这些组件是什么时候创建的以及他们之间的结构关系。 从上到下的层级关系:用户在View上进行操作&…

嵌入式交叉编译:ffmpeg及相关库

目前只编译了部分。其他库需要时再说。 fdk-aac 嵌入式交叉编译:linux fdk-aac-CSDN博客 libvpx 这个最麻烦,还是编译通过啦。 嵌入式交叉编译:libvpx(全网首发)-CSDN博客 x265 嵌入式交叉编译:x265…

考研踩坑经验分享

文章目录 写在前面自身情况简介自身学习路线优点坑点 学习路线建议1、2和3月份3、4和5月份6、7和8月份9、10月份11、12月份 一些私货建议结尾 写在前面 考研是一件非常有盼头的事,但绝对不是一件容易的事。 如果你不能做好来年三月份出成绩时,坦然接受…

Ubuntu 下使用 Scons 交叉编译嘉楠堪智 CanMV K230 大小核 Coremark 程序

在 Ubuntu 下使用 SCons 进行交叉编译嘉楠堪智 CanMV K230 大小核(不同的玄铁 C908 核心)的 C 程序,以 Coremark 程序为例,顺便测试一下大小核和编译器的性能。 2024年3月14日,嘉楠科技宣布推出了全球首款支持 RISC-V…

# 从浅入深 学习 SpringCloud 微服务架构(十七)--Spring Cloud config(1)

从浅入深 学习 SpringCloud 微服务架构(十七)–Spring Cloud config(1) 一、配置中心的 概述 1、配置中心概述 对于传统的单体应用而言,常使用配置文件来管理所有配置,比如 SpringBoot 的 application.y…

消费金融平台公司如何做大做强自营产品

本文来自于2019年的某次内部分享沟通会,部分敏感内容已做删减。

油泼辣子在食品类别可以申请成商标不!

前阵韩国人在美国申请“chili crunch”油泼辣子作为商标,还准备禁止华人餐馆使用投诉侵权并索赔,普推知产老杨在USPTO上面检索发现,这个人申请的主要是30类方便食品的调味品,商标分类是全球通用的。 商标名称不能申请本类所属的通…

C/C++常用的内置的宏定义

常用的C/C 内置宏 这是我在VS2015下运行的 cout << "file " << __FILE__ << endl;cout << "line " << __LINE__ << endl;cout << "date " << __DATE__ << endl;cout << "…

力扣HOT100 - 55. 跳跃游戏

解题思路&#xff1a; class Solution {public boolean canJump(int[] nums) {int n nums.length;int maxReach 0;// 正常来说每次至少跳一格&#xff0c;所以最多循环n次for (int i 0; i < n; i) {if (i > maxReach) return false;// 这种情况代表遇到了0&#xff0…

机器学习周报第三十八周 iTransformer

文章目录 week38 iTransformer摘要Abstract一、文献阅读1. 题目2. abstract3. 网络架构**转置Embedding&#xff1a;****LayerNorm&#xff08;层归一化&#xff09;****Feed-forward network&#xff08;前馈网络&#xff09;****Multivariate-Attention&#xff08;多变量注意…

大数据比赛-环境搭建(一)

1、安装VMware Workstation 链接&#xff1a;https://pan.baidu.com/s/1IvSFzpnQFl3svWyCGRtEmg 提取码&#xff1a;ukpo 内有安装包及破解方式&#xff0c;安装教程。 2、下载Ubuntu系统 阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 (aliyun.com) 点击下载&#xff…

深度解析GoLand map原理及实现,手撕源码!(二)——写入、删除、遍历

前言 本文内容承接前文&#xff1a;深度解析GoLand map原理及实现&#xff0c;手撕源码&#xff01;&#xff08;一&#xff09;——基本介绍&#xff0c;初始化&#xff0c;读 建议先阅读前文哦~ 4.4 写入流程 —— mapassign 写流程主要分为以下步骤&#xff1a; 对key取h…

四川汇昌联信:拼多多运营属于什么行业?

拼多多运营属于什么行业?这个问题看似简单&#xff0c;实则涉及到了电商行业的深层次理解。拼多多运营&#xff0c;顾名思义&#xff0c;就是在拼多多这个电商平台上进行商品销售、推广、客户服务等一系列活动。那么&#xff0c;这个行业具体包含哪些内容呢?下面就从四个不同…

Verilog复习(四)| 组合逻辑

一位全加器结构描述&#xff1a; 数据流描述&#xff1a; 行为描述&#xff1a; 只要有事件发生&#xff08;列表中任何 信号有变化&#xff09;&#xff0c;就执行begin…end 的语句 。 always的事件控制方式 边沿触发 always (posedge clk) // clk从低电平->高&#x…

XML元素

XML 元素是XML文档中的基本组成单位&#xff0c;它由开始标签、结束标签和内容组成&#xff0c;格式如下&#xff1a; <element>content</element>常见的XML元素包括&#xff1a; 根元素&#xff08;Root Element&#xff09;&#xff1a;XML文档中的最外层元素&…

Java学习之异常抛出

异常抛出 1. 异常简介 import java.util.ArrayList;public class DemoException1 {public static void main(String[] args) {/*TODO异常&#xff1a;需求&#xff1a;要买菜做饭1.先制定计划做哪些菜 但是计划里面有问题 比如需要做红烧肉&#xff0c;但是菜单里面写的是排骨…

QT自适应界面 处理高DPI 缩放比界面乱问题

1.pro文件添加 必须添加要不找不到 QT版本需要 5。4 以上才支持 QT widgets 2.main界面提前处理 // 1. 全局缩放使能QApplication::setAttribute(Qt::AA_EnableHighDpiScaling, true);// 2. 适配非整数倍缩放QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::High…

机器学习入门:sklearn基础教程

Scikit-learn&#xff08;简称sklearn&#xff09;是Python中最受欢迎的机器学习库之一&#xff0c;它提供了丰富的机器学习算法和工具&#xff0c;适用于各种任务和场景。本文将为您介绍sklearn的基础知识和常用功能&#xff0c;带您踏入机器学习的世界。 1. 安装与导入 首先…

OpenCV图像转换处理

1.概述 在深度学习出现之前&#xff0c;图像处理主要有仿射变换与非仿射变换。 2.理论对比 2.1 仿射变换 2.2 非仿射变换 2.3 投射变换 3.代码实现 #include <iostream> #include <opencv2/opencv.hpp>int main(int argc, char** argv) {if(argc ! 2) {std::c…