LeetCode 120. 三角形最小路径和(Triangle)
题目描述
给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。
例如,给定三角形:
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。
说明:
如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分。
解题思路
考虑用动态规划解题。用一个数组dp[n]记录每层各个节点为路径终点的最小路径和,这样每遍历到新的一层,就根据上一层记录的dp来更新本层的dp.由于以某节点为终点的路径的上一个节点可以是两个不同的节点,而更新dp会覆盖路径中的节点,所以用f来记录对应本节点在上一层靠左的最小路径,并且用l记录上一层最右端的最小路径。具体而言分为三种情况:
- 若n=0,即遍历到本层的第一个节点,那么以此节点为终点的路径只有一条,直接更新dp[n]=dp[n]+triangle[i][j]
- 若n=i,即遍历到本层的最后一个节点,那么以此节点为终点的路径只有一条,直接更新dp[n]=l+triangle[i][j]
- 若0<n<i,即遍历到中间节点,首先记录最小路径和path=min(f+triangle[i][j],dp[j]+triangle[i][j]),然后更新f=dp[j],dp[j]=path
如果遍历到最后一层,那么用minSum记录该层的最小路径和,没计算出一个节点的最小路径和,就更新minSum
代码
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
int n=triangle.size();
if(n==)
return triangle[][];
vector<int> dp(n,triangle[][]);
int minSum=INT_MAX;
int f,l;
for(int i=;i<n;i++){
f=dp[];
l=dp[i-];
for(int j=;j<=i;j++){
if(j==)
dp[j]+=triangle[i][j];
else if(j==i)
dp[j]=l+triangle[i][j];
else{
int path=min(f+triangle[i][j],dp[j]+triangle[i][j]);
f=dp[j];
dp[j]=path;
}
if(i==n-)
if(dp[j]<minSum)
minSum=dp[j];
}
}
return minSum;
}
};
LeetCode 120. 三角形最小路径和(Triangle)的更多相关文章
- Java实现 LeetCode 120 三角形最小路径和
120. 三角形最小路径和 给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如,给定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] ...
- 领扣-120 三角形最小路径和 Triangle MD
三角形最小路径和 Triangle 数组 动态规划 问题 给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如,给定三角形: [2], [3,4], [6,5,7], ...
- leetcode 120. 三角形最小路径和 及 53. 最大子序和
三角形最小路径和 问题描述 给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如,给定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] ...
- leetcode 120. 三角形最小路径和 JAVA
题目: 给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如,给定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 自顶向下的最小路径和 ...
- LeetCode 120——三角形最小路径和
1. 题目 2. 解答 详细解答方案可参考北京大学 MOOC 程序设计与算法(二)算法基础之动态规划部分. 从三角形倒数第二行开始,某一位置只能从左下方或者右下方移动而来,因此,我们只需要求出这两者的 ...
- 1. 线性DP 120. 三角形最小路径和
经典问题: 120. 三角形最小路径和 https://leetcode-cn.com/problems/triangle/ func minimumTotal(triangle [][]int) ...
- [Swift]LeetCode120. 三角形最小路径和 | Triangle
Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent n ...
- 【LeetCode】三角形最小路径和
[问题]给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上.例如,给定三角形: [ [], [,], [,,], [,,,] ] 自顶向下的最小路径和为 (即, + + + ...
- 算法学习->求解三角形最小路径
00 问题 00-1 描述 对给定高度为n的一个整数三角形,找出从顶部到底部的最小路径和.每个整数只能向下移动到与之相邻的整数. 找到一个一样的力扣题:120. 三角形最小路径和 - 力扣(LeetC ...
随机推荐
- 如何在Python中快速画图——使用Jupyter notebook的魔法函数(magic function)matplotlib inline
如何在Python中快速画图--使用Jupyter notebook的魔法函数(magic function)matplotlib inline 先展示一段相关的代码: #we test the ac ...
- with as 语句
with就是一个sql片段,供后面的sql语句引用. 详情参见:https://www.cnblogs.com/Niko12230/p/5945133.html
- 【From StackOverFlow】--set-upstream 和--set-upstream-to=以及--track的区别
本文引自StackOverFlow http://stackoverflow.com/questions/26090689/git-set-upstream-to-vr-track
- 用原生js来写一个swiper滑块插件
是不是有点印象了,没错,他的最基本的用法就是左右滑动,插件使用者只需要写几行简单的html和js即可实现一个简单滑动效果,不过你完全可以组合各种元素来适应不同的场景. 当然插件我已经写好了,咱 ...
- 【项目构建工具】 Gradle笔记1
一.Gradle简介 Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具.它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XM ...
- HTTPS中CA证书的签发及使用过程
1,HTTPS 简单来讲,HTTPS (Secure Hypertext Transfer Protocol)安全超文本传输协议就是安全的HTTP,我们知道HTTP是运行在TCP层之上的,HTTPS在 ...
- Delphi Label组件
- 一,python简介 笔记
python历史 1,1989年圣诞节,Guido von Rossum开始编写python语言编译器 2,1991年2月,第一个python编译器诞生,是c语言实现的,后面又出现了c#和java版本 ...
- linux 用户及文件权限管理
Linux 是一个可以实现多用户登陆的操作系统,比如“李雷”和“韩梅梅”都可以同时登陆同一台主机,他们共享一些主机的资源,但他们也分别有自己的用户空间,用于存放各自的文件.但实际上他们的文件都是放在同 ...
- poj 1655 找树的重心
树形DP 求树的重心,即选择一个结点删去,使得分出的 若干棵树的结点数 的最大值最小 #include<map> #include<set> #include<cmath ...