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上进行操作&…

考研踩坑经验分享

文章目录 写在前面自身情况简介自身学习路线优点坑点 学习路线建议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…

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

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

Verilog复习(四)| 组合逻辑

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

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

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

打印图形(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int i, j;//循环打印&#xff1b;for (i 0; i < 5; i){//列&#xff1b;for (j 0; j &…

SpringBoot+Vue实现图片滑块和文字点击验证码

一、背景 1.1 概述 传统字符型验证码展示-填写字符-比对答案的流程&#xff0c;目前已可被机器暴力破解&#xff0c;应用程序容易被自动化脚本和机器人攻击。 摒弃传统字符型验证码&#xff0c;采用行为验证码采用嵌入式集成方式&#xff0c;接入方便&#xff0c;安全&#…

光伏电站智能管理平台功能全面介绍

一、介绍 光伏电站智能管理平台专门为了光伏电站服务的融合了项目沟通、在线设计、施工管理、运维工单等多智能光伏管理系统&#xff0c;可以满足光伏电站建设前期沟通、中期建设和后续维护的一体化智能平台&#xff0c;同时通过组织架构对企业员工进行线上管理和数据同步&…

BUU-二维码

题目 解题 打开是一张图片&#xff0c;扫描二维码后显示 secret is here 一时没有思路&#xff0c;看别人的wp https://blog.csdn.net/wusimin432503/article/details/125692459https://blog.csdn.net/weixin_45728231/article/details/120988424?spm1001.2101.3001.6661.1…

显卡、显卡驱动、CUDA、cuDNN、CUDA Toolkit、NVCC、nvidia-smi等概念的区别与联系

在科技日新月异的今天&#xff0c;显卡、显卡驱动、CUDA、cuDNN、CUDA Toolkit、NVCC、nvidia-smi等术语已经成为了科技领域的重要组成部分。本文旨在阐述这些术语之间的区别与联系&#xff0c;帮助您更好地理解它们在技术生态系统中的作用。 一、显卡 显卡&#xff0c;也称为…

(动画详解)LeetCode面试题 02.04.分割链表

&#x1f496;&#x1f496;&#x1f496;欢迎来到我的博客&#xff0c;我是anmory&#x1f496;&#x1f496;&#x1f496; 又和大家见面了 欢迎来到动画详解LeetCode系列 用通俗易懂的动画的动画使leetcode算法题可视化 先来自我推荐一波 个人网站欢迎访问以及捐款 推荐阅读…