题目

给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。

例如,给定三角形:

[[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. 三角形最小路径和相关推荐

  1. leetcode - 120. 三角形最小路径和

    120. 三角形最小路径和 ------------------------------------------ 给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如 ...

  2. leetcode--笔记——120. 三角形最小路径和

    120. 三角形最小路径和 给定一个三角形 triangle ,找出自顶向下的最小路径和. 每一步只能移动到下一行中相邻的结点上.相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一 ...

  3. Leetcode 120. 三角形最小路径和 (每日一题 20210927)

    给定一个三角形 triangle ,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上.相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点 ...

  4. [Leetcode][第120题][JAVA][三角形最小路径和][动态规划][递归]

    [问题描述][中等] [解答思路] 1. 动态规划思路一 自上而下 第 1 步:设计状态 f[i][j] 表示从三角形顶部走到位置 (i,j) 的最小路径和 位置(i,j) 指的是三角形中第 i 行第 ...

  5. LeetCode 120. 三角形最小路径和(动态规划)

    题目描述 给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如,给定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 自顶向下的最小路径 ...

  6. Leetcode 120. 三角形最小路径和 解题思路及C++实现

    解题思路: 这是一个典型的动态规划问题,定义一个数组  dp,dp[i] (tmp[i]也是)表示到达当前行第 i 个元素的最小路径和. 所以只需要定义一个1维数组dp(n, 0),每循环遍历第 i ...

  7. 120. 三角形最小路径和

    给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点. 例如,给定三角 ...

  8. 【Java语言】力扣系列----120. 三角形最小路径和

    给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点. 例如,给定三角 ...

  9. LeetCode 120. 三角形最小路径和

    思路: 从下(倒数第二行)往上开始计算,找到最先和之后,每一行的值重新赋值,直到最顶层就是最小值了. public int minimumTotal(List<List<Integer&g ...

  10. C#LeetCode刷题之#63-不同路径 II​​​​​​​(Unique Paths II)

    目录 问题 示例 分析 问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3682 访问. 一个机器人位于一个 m x ...

最新文章

  1. 2_2 DecorateMode.cpp 装饰者模式
  2. redis布隆过滤器PHP,Redis 中的布隆过滤器
  3. saphana服务器硬件评估,华为SAP HANA一体机:你身边的数据计算专家
  4. RNA-Seq分析软件HTSeq的安装
  5. Linux系统的优缺点
  6. Python文件(一):文件类型、文件的打开,读取写入,关闭、文件备份、文件和文件夹的操作
  7. linux定时器tinner,第三章 套接字相关数据结构--基于Linux3.10
  8. LCS 最大子段和,最大子段和在原数组的首末地址
  9. FTP+SSL(加密的ftp)
  10. Google 推出移动版任务管理工具 Google Tasks
  11. 前端面试八股文(超详细)
  12. Android EagleEye笔记
  13. vue打包时页面布局出现混乱
  14. deepin做服务器稳定吗,deepin从兴致勃勃到彻底放弃
  15. 详解Gem5模拟器的4种CPU模型
  16. linux 端口耗尽,解决端口耗尽问题: tcp_tw_reuse、tcp_timestamps
  17. 凭本事当的组长,凭什么工资还没手下高?
  18. English trip EM2-PE 3B Teacher:Olivia
  19. 【图文详解】入职必备—3分钟学会SVN快速上手
  20. 做为程序员 给大家推荐不很错的淘宝店

热门文章

  1. P1038 神经网络[拓扑]
  2. leetcode 153. 寻找旋转排序数组中的最小值(Find Minimum in Rotated Sorted Array)
  3. 前两篇转载别人的精彩文章,自己也总结一下python split的用法吧!
  4. 【Qt点滴】UDP协议实例:简易广播实现
  5. 浅复制和深复制的区别?//浅拷贝和深拷贝
  6. C++ container member map
  7. 做好一个系统分析师、项目经理75条准则
  8. 调用wsdl的接口-用axis
  9. c语言 int (*p)[5] 类型分析
  10. 一份最新的、全面的NLP文本分类综述