LeetCode刷题——120. 三角形最小路径和
题目
给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。
例如,给定三角形:
[[2],[3,4],[6,5,7],[4,1,8,3]
]
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。
说明:
如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/triangle
思路
题目要求每一步只能移动到下一行中相邻的节点上。比如3只能移动到6或5;4只能移动到5或7。
我们先来思考下能否递归的解决,它内部是否有递归的结构。
我们自顶向下的思考问题,先考虑最上面的那一层(第0层,用(0,0)表示),然后向下移动一步,只能是3(1,0)或4(1,1)。假设我们已经知道3或4哪个是最小的。
那么直接用当前路径(2)加上经过3或4中路径最小的即可。
这里用(level,index)表示这颗树上的某个节点,比如顶层(第0层)就是(0,0);第1层就是(1,0)和(1,1)。
我们这里简单的画一下递归树,可以看到只画了三层就已经存在重叠子问题了。我们先用递归算法写出来,然后用记忆化搜索来优化,最后改成动态规划。
代码
递归
class Solution(object):def minimum(self,triangle,i,level,last_level):if level == last_level:return triangle[level][i]#如果是最底层,返回本身#否则返回当前节点值加下层中最小值return triangle[level][i] + min(self.minimum(triangle,i,level+1,last_level),self.minimum(triangle,i+1,level+1,last_level))def minimumTotal(self, triangle):""":type triangle: List[List[int]]:rtype: int"""last_level = len(triangle) - 1 # 保存了最后一层的值return self.minimum(triangle,0,0,last_level) #从(0,0)开始
整个递归思路是没问题的,虽然耗时较长导致超时,但是我们可以基于此思路改写成记忆化搜索的方式(参阅LeetCode刷题之动态规划思想)。
记忆化搜索
class Solution(object):def minimum(self,triangle,i,level,last_level,dp):if level == last_level:return triangle[level][i]# 通过dp保存了(level,i)的计算值,防止重复计算if (level,i) not in dp:dp[(level,i)] = triangle[level][i] + min(self.minimum(triangle,i,level+1,last_level,dp),self.minimum(triangle,i+1,level+1,last_level,dp)) #否则返回当前节点值加下层return dp[(level,i)]def minimumTotal(self, triangle):""":type triangle: List[List[int]]:rtype: int"""dp = {}last_level = len(triangle) - 1return self.minimum(triangle,0,0,last_level,dp)
改写的方式就比较直观,这里把dp
作为参数进行递归传递。
很好,改成记忆化搜索的方式就可以通过了。
但是我们的最终目标是改成动态规划的形式。
动态规划
class Solution(object):def minimumTotal(self, triangle):""":type triangle: List[List[int]]:rtype: int""" last_level = len(triangle) - 1for level in range(last_level-1,-1,-1):#由底向上,从倒数第2层到第0层for i in range(0,level+1):#归纳法,第level层,最多有level+1个节点triangle[level][i] = triangle[level][i] + min(triangle[level+1][i],triangle[level+1][i+1])return triangle[0][0]
这里我们通过改写原列表,可以省去了dp
这个字典结构。从倒数第二层开始更新最小路径值,直到第0层,最终输出(0,0)的值即可。
LeetCode刷题——120. 三角形最小路径和相关推荐
- leetcode - 120. 三角形最小路径和
120. 三角形最小路径和 ------------------------------------------ 给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如 ...
- leetcode--笔记——120. 三角形最小路径和
120. 三角形最小路径和 给定一个三角形 triangle ,找出自顶向下的最小路径和. 每一步只能移动到下一行中相邻的结点上.相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一 ...
- Leetcode 120. 三角形最小路径和 (每日一题 20210927)
给定一个三角形 triangle ,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上.相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点 ...
- [Leetcode][第120题][JAVA][三角形最小路径和][动态规划][递归]
[问题描述][中等] [解答思路] 1. 动态规划思路一 自上而下 第 1 步:设计状态 f[i][j] 表示从三角形顶部走到位置 (i,j) 的最小路径和 位置(i,j) 指的是三角形中第 i 行第 ...
- LeetCode 120. 三角形最小路径和(动态规划)
题目描述 给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如,给定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 自顶向下的最小路径 ...
- Leetcode 120. 三角形最小路径和 解题思路及C++实现
解题思路: 这是一个典型的动态规划问题,定义一个数组 dp,dp[i] (tmp[i]也是)表示到达当前行第 i 个元素的最小路径和. 所以只需要定义一个1维数组dp(n, 0),每循环遍历第 i ...
- 120. 三角形最小路径和
给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点. 例如,给定三角 ...
- 【Java语言】力扣系列----120. 三角形最小路径和
给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点. 例如,给定三角 ...
- LeetCode 120. 三角形最小路径和
思路: 从下(倒数第二行)往上开始计算,找到最先和之后,每一行的值重新赋值,直到最顶层就是最小值了. public int minimumTotal(List<List<Integer&g ...
- C#LeetCode刷题之#63-不同路径 II(Unique Paths II)
目录 问题 示例 分析 问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3682 访问. 一个机器人位于一个 m x ...
最新文章
- 2_2 DecorateMode.cpp 装饰者模式
- redis布隆过滤器PHP,Redis 中的布隆过滤器
- saphana服务器硬件评估,华为SAP HANA一体机:你身边的数据计算专家
- RNA-Seq分析软件HTSeq的安装
- Linux系统的优缺点
- Python文件(一):文件类型、文件的打开,读取写入,关闭、文件备份、文件和文件夹的操作
- linux定时器tinner,第三章 套接字相关数据结构--基于Linux3.10
- LCS 最大子段和,最大子段和在原数组的首末地址
- FTP+SSL(加密的ftp)
- Google 推出移动版任务管理工具 Google Tasks
- 前端面试八股文(超详细)
- Android EagleEye笔记
- vue打包时页面布局出现混乱
- deepin做服务器稳定吗,deepin从兴致勃勃到彻底放弃
- 详解Gem5模拟器的4种CPU模型
- linux 端口耗尽,解决端口耗尽问题: tcp_tw_reuse、tcp_timestamps
- 凭本事当的组长,凭什么工资还没手下高?
- English trip EM2-PE 3B Teacher:Olivia
- 【图文详解】入职必备—3分钟学会SVN快速上手
- 做为程序员 给大家推荐不很错的淘宝店
热门文章
- P1038 神经网络[拓扑]
- leetcode 153. 寻找旋转排序数组中的最小值(Find Minimum in Rotated Sorted Array)
- 前两篇转载别人的精彩文章,自己也总结一下python split的用法吧!
- 【Qt点滴】UDP协议实例:简易广播实现
- 浅复制和深复制的区别?//浅拷贝和深拷贝
- C++ container member map
- 做好一个系统分析师、项目经理75条准则
- 调用wsdl的接口-用axis
- c语言 int (*p)[5] 类型分析
- 一份最新的、全面的NLP文本分类综述