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

news2024/11/24 12:50:47

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容,和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣!

  • 推荐:数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注
    在这里插入图片描述

  • 导航

    • LeetCode解锁1000题: 打怪升级之旅:每题都包括3-5种算法,以及详细的代码实现,刷题面试跳槽必备
    • 漫画版算法详解:通过漫画的形式和动态GIF图片把复杂的算法每一步进行详细可视解读,看一遍就掌握
    • python源码解读:解读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 = 10

dp: [7, 6, 10]
更新到第三行
  1. 同理,更新 dp 数组为第三行的每个元素加上其下面行中相邻元素的较小者:
更新过程:
dp[0]: 3 + min(7, 6) = 3 + 6 = 9
dp[1]: 4 + min(6, 10) = 4 + 6 = 10

dp: [9, 10]
更新到第四行(顶行)
  1. 最后更新顶行:
更新过程:
dp[0]: 2 + min(9, 10) = 2 + 9 = 11

dp: [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 0
        if 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.coloradmin.cn/o/1669946.html

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

相关文章

Java--初识类和对象

前言 本篇讲解Java类和对象的入门版本。 学习目的: 1.理解什么是类和对象。 2.引入面向对象程序设计的概念 3.学会如何定义类和创建对象。 4.理解this引用。 5.了解构造方法的概念并学会使用 考虑到篇幅过长问题,作者决定分多次发布。 面向对象的引入 J…

《QT实用小工具·六十三》QT实现微动背景,界面看似静态实则动态

1、概述 源码放在文章末尾 该项目实现了微动背景,界面看似静态实则动态,风动,幡动,仁者心动,所以到底是什么在动?哈哈~ 界面会偷偷一点一点改动文字颜色的颜色填充。 虽然是动态,但是慢到难以…

羊大师解析,如何遵守《节约用水条例》

羊大师解析,如何遵守《节约用水条例》 《节约用水条例》的实施旨在倡导和推动全社会形成节约用水的良好风尚,以应对日益严峻的水资源短缺问题。羊大师发现随着这一条例的深入实施,越来越多的人开始意识到节约用水的重要性,并积极…

HTML5实现简洁好看的个人主页,个人小站(多种风格附源码)

文章目录 1.烟灰主题个人主页1.1 个人主页界面1.2 个人信息界面1.3 兴趣爱好界面1.4 个人作品界面 2.紫霞主题个人主页2.1 个人主页界面2.2 个人信息界面2.3 兴趣爱好界面2.4 个人作品界面 3.墨夜主题个人主页3.1 个人主页界面3.2 个人信息界面3.3 兴趣爱好界面3.4 个人作品界面…

《小猫咪大城市》 48小时销量破40万套,一匹休闲游戏黑马诞生

易采游戏网5月13日消息,近日一款名为《小猫咪大城市》的游戏在Steam、Switch和Xbox平台上正式发售,凭借其独特的游戏设定和可爱的猫咪角色,迅速赢得了玩家们的喜爱。据官方宣布,游戏在发售后的短短48小时内,销量已经突…

汽车灯罩材料使用PMMA(亚克力)具有哪些优势?汽车车灯的灯罩如果破损破裂破洞了要怎么修复?

汽车灯罩材料使用PMMA(亚克力)具有哪些优势 首先,PMMA具有高透明度,其透光率可达92%以上,使得光线能够均匀、清晰地透过灯罩,为驾驶者提供明亮且均匀的照明效果,确保行车安全。 其次&#xff…

JavaEE初阶-多线程进阶1

文章目录 前言一、常见的锁策略1.1 乐观锁与悲观锁1.2 重量级锁与轻量级锁1.3 自旋锁与挂起等待锁1.4 可重入锁与不可重入锁1.5 公平锁与非公平锁1.6 互斥锁与读写锁 二、synchronized的优化策略2.1 锁升级2.2 锁消除2.3 锁粗化 前言 多线程进阶的内容在面试中容易考&#xff…

解决SpringBoot整合MyBatis和MyBatis-Plus,请求后不打印sql日志

问题发现 在整合springBootmyBatis时,发现请求不打印sql日志,示例代码如下: RestController public class MyController {AutowiredProductMapper productMapper;GetMapping("/test")public void test() {System.out.println(&qu…

【知识碎片】2024_05_12

本篇记录了两个代码题【字符个数的统计】和【多数元素】(下有一段快排的代码)&#xff0c;以及两个关于数组的选择题。 每日代码 字符个数统计 字符个数统计_牛客题霸_牛客网 统计ascall码在0~127内的字符出现过几次&#xff08;重复出不再计算&#xff09; #include <st…

快速入门:利用Go语言下载Amazon商品信息的步骤详解

概述 在这篇文章中&#xff0c;我们将深入探讨如何利用Go语言这一强大的工具&#xff0c;结合代理IP技术和多线程技术&#xff0c;实现高效下载Amazon的商品信息。首先&#xff0c;让我们来看看为什么选择Go语言作为开发网络爬虫的首选语言。 Go语言在网络开发中的特点 简洁…

Redis五大基本数据类型介绍及其使用场景

文章目录 1 String&#xff08;字符串&#xff09;应用场景 2 List&#xff08;列表&#xff09;应用场景 3 Set&#xff08;集合&#xff09;4 sorted set&#xff08;有序集合&#xff09;应用场景 5 hash&#xff08;哈希&#xff09;应用场景 Redis 是一个开源&#xff0c;…

Spring Boot集成zookeeper快速入门Demo

1.什么是zookeeper&#xff1f; Zookeeper 是一个开源的分布式协调服务&#xff0c;目前由 Apache 进行维护。Zookeeper 可以用于实现分布式系统中常见的发布/订阅、负载均衡、命令服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。它具有以下特性…

webAPIs第二天

事件监听 什么是事件&#xff1f; 事件是在编程时系统内发生的动作或者发生的事情 比如用户在网页上单击一个按钮 什么是事件监听&#xff1f; 就是让程序检测是否有事件产生&#xff0c;一旦有事件触发&#xff0c;就立即调用一个函数做出响应&#xff0c;也称为 绑定事件或者…

常用的30个linux命令总结

1、常用30个命令总结 2、具体参数用法参考网站&#xff1a; Linux命令大全(手册) – 真正好用的Linux命令在线查询网站

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

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

【网络安全入门】你必须要有的学习工具(附安装包)零基础入门到进阶,看这一篇就够了!

工欲善其事必先利其器 在新入门网络安全的小伙伴而言。这些工具你必须要有所了解。本文我们简单说说这些网络安全工具吧&#xff01; Web安全类 Web类工具主要是通过各种扫描工具&#xff0c;发现web站点存在的各种漏洞如sql注入、xss等。从而获取系统权限&#xff0c;常用的…

Node.js版本管理工具nvm安装

1.下载nvm https://github.com/coreybutler/nvm-windows/releaseshttps://github.com/coreybutler/nvm-windows/releases 2.安装nvm 双击打开下载好的压缩包解压出的文件 目录中不要有中文 这个是配置切换node版本后的存储位置 然后一路下一步就行了 3.安装并使用node 安装…

vue uniapp 小程序 判断日期是今天(显示时分秒)、昨天、本周的周几、超出本周显示年月日

效果图&#xff1a; util.js /*** 转换时间*/ const messageFormat (datetime) >{ let result "";let currentTime new Date();if(isToday(datetime)){result datetime.substring(11,16);}else if(isYesterday(datetime)){result "昨天";}else if(…

代码随想录阅读笔记-动态规划【爬楼梯】

题目 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 注意&#xff1a;给定 n 是一个正整数。 示例 1&#xff1a; 输入&#xff1a; 2输出&#xff1a; 2解释&#xff1a; 有两种方法可以爬到楼…

2024年小程序视频如何下载到手机

在2024年的数字时代&#xff0c;小程序已成为我们生活中不可或缺的一部分&#xff0c;它们如同星辰般点缀在我们的日常之中&#xff0c;为我们带来便捷与乐趣。然而&#xff0c;你是否曾因网络的不稳定而错失了那些精彩绝伦的小程序视频&#xff1f;是否曾在离线的时刻&#xf…