力扣经典题目之120.三角形最小路径和

embedded/2025/1/16 2:42:56/

今天继续给大家分享一道力扣的做题心得今天这道题目是 120.三角形最小路径和

题目如下:

题目链接:三角形最小路径和


1,题目分析

        这个问题要求我们在一个数字三角形中找到从顶部到底部的路径,使得路径上的数字总和最小。三角形的每一行数字数量递增,从顶部开始,每一步可以选择移动到下一行的相邻数字上。对于这类问题是一种经典的动态规划的问题,我们使用动态规划的相关方法解决此题。

        动态规划(Dynamic Programming, DP)是一种通过把原问题分解为相对简单的子问题的方式来求解复杂问题的方法。在这个问题中,我们使用DP来存储到达每个位置的最小路径和。

2,解题思路

java">class Solution {public int minimumTotal(List<List<Integer>> triangle) {int n = triangle.size();int[][] dp = new int[n][n];dp[0][0] = triangle.get(0).get(0);for (int i = 1; i < n; i++) {dp[i][0] = dp[i-1][0] + triangle.get(i).get(0);}for (int i = 1; i < n; i++) {for (int j = 1; j <= i; j++) {if (j == i) {// 处理每一行的最后一个元素dp[i][j] = dp[i-1][j-1] + triangle.get(i).get(j);} else {// 处理中间元素dp[i][j] = Math.min(dp[i-1][j-1], dp[i-1][j]) + triangle.get(i).get(j);}}}// 找最后一行的最小值int minPathSum = dp[n-1][0];for (int j = 1; j < n; j++) {if (dp[n-1][j] < minPathSum) {minPathSum = dp[n-1][j];}}return minPathSum;}
}
  1. 初始化DP数组:创建一个二维数组dp,其中dp[i][j]表示到达第i行第j列位置的最小路径和。初始时,dp[0][0]被设置为三角形顶部的数字。
  2. 边界条件处理
    • 对于每一行的第一个元素,由于只能从上一行的第一个元素到达,因此dp[i][0] = dp[i-1][0] + triangle.get(i).get(0)
    • 对于每一行的最后一个元素,由于只能从上一行的最后一个元素到达,因此dp[i][i] = dp[i-1][i-1] + triangle.get(i).get(i)
  3. 填充DP数组
    • 对于中间的元素,我们可以从上一行的两个相邻元素到达,因此需要选择路径和较小的那个,即dp[i][j] = Math.min(dp[i-1][j-1], dp[i-1][j]) + triangle.get(i).get(j)
  4. 结果提取:遍历dp数组的最后一行,找到最小值,这个值就是从三角形顶部到底部的最小路径和

代码详细分析 

1. 初始化动态规划数组
int n = triangle.size();
int[][] dp = new int[n][n];

这里创建了一个二维数组 dp,其大小与输入的三角形相同。dp[i][j] 用于存储从三角形顶部到位置 (i, j) 的最小路径和。

2. 初始化第一个元素
dp[0][0] = triangle.get(0).get(0);

三角形的顶部元素直接赋值给 dp[0][0],因为这是路径的起点。

3. 初始化第一列
for (int i = 1; i < n; i++) {dp[i][0] = dp[i-1][0] + triangle.get(i).get(0);
}

对于每一行的第一个元素,只能从上一行的第一个元素移动过来,因此直接累加即可。

4. 填充动态规划数组
for (int i = 1; i < n; i++) {for (int j = 1; j <= i; j++) {if (j == i) {// 处理每一行的最后一个元素dp[i][j] = dp[i-1][j-1] + triangle.get(i).get(j);} else {// 处理中间元素dp[i][j] = Math.min(dp[i-1][j-1], dp[i-1][j]) + triangle.get(i).get(j);}}
}
  • 对于每一行的最后一个元素,只能从上一行的最后一个元素移动过来,因此直接累加。
  • 对于中间的元素,可以选择从上一行的相邻两个元素中路径和较小的那个移动过来,因此取两者的最小值并累加。
5. 找到最后一行的最小值
int minPathSum = dp[n-1][0];
for (int j = 1; j < n; j++) {if (dp[n-1][j] < minPathSum) {minPathSum = dp[n-1][j];}
}

最后一行的每个元素代表从顶部到该位置的最小路径和。遍历最后一行,找到其中的最小值,即为整个三角形的最小路径和。

6. 返回结果
return minPathSum;

返回计算得到的最小路径和。

4,总结

        感谢大家的阅读,希望这篇解题心得能为大家带来一些收获,我们共同进步!大家的点赞就是我的动力谢谢大家,还有什么更优解或者问题欢迎大家在评论区讨论分享!


http://www.ppmy.cn/embedded/154281.html

相关文章

Linux离线部署ELK

文章目录 前期准备开始安装安装elastic search安装logstash安装kibana 配置ELK配置ElasticSearch配置logstash配置kibana 启动ELK启动命令启动测试 设置ELK策略创建ILM策略将ILM策略与日志index关联查看索引是否被ILM策略管理 前期准备 ELK包含三部分软件 ElasticSearch用作搜…

模板方法模式详解

模板方法模式&#xff08;Template Method Pattern&#xff09;是一种行为型设计模式&#xff0c;它在方法中定义算法的框架&#xff0c;延迟到子类中实现。模板方法使得子类可以在不改变算法结构的情况下&#xff0c;重新定义算法中的某些步骤。下面对模板方法模式进行详细讲解…

Git | git reset命令详解

关注&#xff1a;CodingTechWork 引言 Git 是一款非常流行的分布式版本控制工具&#xff0c;它帮助开发者有效地管理代码历史&#xff0c;支持多种功能来帮助团队协作、追踪修改和维护代码质量。git reset是 Git 中最强大、最复杂的命令之一&#xff0c;它的主要作用是重置当前…

【01】AE特效开发制作特技-Adobe After Effects-AE特效制作快速入门-制作飞机,子弹,爆炸特效以及导出png序列图-优雅草央千澈

【01】AE特效开发制作特技-Adobe After Effects-AE特效制作快速入门-制作飞机&#xff0c;子弹&#xff0c;爆炸特效以及导出png序列图-优雅草央千澈 开发背景 优雅草央千澈所有的合集&#xff0c;系列文章可能是不太适合完全初学者的&#xff0c;因为课程不会非常细致的系统…

flutter VoidCallBack ValueChange<T> 的函数定义

在 Flutter 中&#xff0c;VoidCallback 和 ValueChanged<T> 是两种常用的回调函数类型&#xff0c;它们通常用于处理事件或传递数据。下面是它们的详细定义及使用方式。 1. VoidCallback 函数类型 VoidCallback 是一个没有参数也没有返回值的回调函数类型。它通常用于…

windows wsl ubuntu22 远程桌面连接

转载链接&#xff1a;https://canwdev.github.io/VM%E8%99%9A%E6%8B%9F%E6%9C%BA/WSL/wsl2%20wslg%20%E9%85%8D%E7%BD%AE%E5%B9%B6%E5%BC%80%E5%90%AF%E8%BF%9C%E7%A8%8B%E6%A1%8C%E9%9D%A2%28xrdp%29/ Wsl2 wslg 配置并开启远程桌面(xrdp) 准备工作 推荐到微软应用商店下载最…

61_Redis服务器端优化

1.持久化配置 Redis的持久化虽然可以保证数据安全,但也会带来很多额外的开销,因此持久化请遵循下列建议: 用来做缓存的Redis实例尽量不要开启持久化功能建议关闭RDB持久化功能,使用AOF持久化利用脚本定期在slave节点做RDB,实现数据备份设置合理的rewrite阈值,避免频繁的…

Ubuntu下安装Harbor

安装Harbor 1.Harbor简介1.1 关键特性1.2 使用场景2.安装2.0 前置要求2.0.1 硬件2.0.2 软件2.0.3 网络2.1 下载2.2 配置2.3 安装2.4 登录web-UI2.5 创建一个项目2.6 推送2.7 拉取3 服务启停在ubuntu24.04.1下安装harbor 1.Harbor简介 Harbor 是一个开源的 Docker registry 服务…