Leetcode 120. 三角形最小路径和Triangle 三角形——找出三角形中从上至下和最小的路 tag 数组 动态规划
Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below.
For example, given the following triangle
[ [2], [3,4], [6,5,7], [4,1,8,3] ]
The minimum path sum from top to bottom is 11
(i.e., 2 + 3 + 5 + 1 = 11).
Note:
Bonus point if you are able to do this using only O(n) extra space, where n is the total number of rows in the triangle.
这道题和Dungeon Game 地牢游戏非常的类似,都是用动态规划Dynamic Programming来求解的问题。而且递推式也比较容易看出来,我最先想到的方法是:
从第二行开始,triangle[i][j] = min(triangle[i - 1][j - 1], triangle[i - 1][j]), 然后两边的数字直接赋值上一行的边界值,由于限制了空间复杂度,所以我干脆直接就更新triangle数组,代码如下:
1 class Solution { 2 public: 3 int minimumTotal(vector<vector<int> > &triangle) { 4 int n = triangle.size(); 5 for (int i = 1; i < n; ++i) { 6 for (int j = 0; j < triangle[i].size(); ++j) { 7 if (j == 0) triangle[i][j] += triangle[i - 1][j]; 8 else if (j == triangle[i].size() - 1) triangle[i][j] += triangle[i - 1][j - 1]; 9 else { 10 triangle[i][j] += min(triangle[i - 1][j - 1], triangle[i - 1][j]); 11 } 12 } 13 } 14 int res = triangle[n - 1][0]; 15 for (int i = 0; i < triangle[n - 1].size(); ++i) { 16 res = min(res, triangle[n - 1][i]); 17 } 18 return res; 19 } 20 };
这种方法可以通过OJ,但是毕竟修改了原始数组triangle,并不是很理想的方法。在网上搜到一种更好的DP方法,这种方法复制了三角形最后一行,作为用来更新的一位数组。然后逐个遍历这个DP数组,对于每个数字,和它之后的元素比较选择较小的再加上上面一行相邻位置的元素做为新的元素,然后一层一层的向上扫描,整个过程和冒泡排序的原理差不多,最后最小的元素都冒到前面,第一个元素即为所求。代码如下:
1 class Solution { 2 public: 3 int minimumTotal(vector<vector<int> > &triangle) { 4 int n=triangle.size(); 5 vector<int> dp(triangle.back()); 6 for(int i=n-2;i>=0;i--){ 7 for(int j=0;j<triangle[i].size();j++){ 8 dp[j]=min(dp[j],dp[j+1])+triangle[i][j]; 9 } 10 } 11 return dp[0]; 12 } 13 };
下面我们来看一个例子,对于输入数组:
-1
2 3
1 -1 -3
5 3 -1 2
下面我们来看DP数组的变换过程。
DP:5 3 -1 2
DP:4 3 -1 2 :1+min(5,3)=4
DP:4 -2 -1 2 :-1+min(3,-1)=-2
DP:4 -2 -4 2 :-3+min(-1,2)=-4
DP:0 -2 -4 2 :2+min(4,-2)=0
DP:0 -1 -4 2 :3+min(-2,-4)=-1
DP:-2 -1 -4 2 :-1+min(0,-1)=-2
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了