LeetCode笔记 用动态规划解决【120 三角形最小路径和】
2021年1月28日
给定一个三角形 triangle
,找出自顶向下的最小路径和。
每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i
,那么下一步可以移动到下一行的下标 i
或 i + 1
。
示例 1:
1 | 输入:triangle = [[2],[3,4],[6,5,7],[4,1,8,3]] |
示例 2:
1 | 输入:triangle = [[-10]] |
思路
贪心算法
此题很容易想到使用贪心算法求解,既从顶点开始,每一步都选择值最小的点向下前进。在示例提供的数据中这种算法可以找到最优解。但需要考虑在一些情况下,贪心算法仅能找到局部最优解,例如:
1 | 2 |
动态规划
这道题目其实类似于背包问题,天然适用与动态规划,甚至于我们可以直接在现有的三角形上构建动态规划矩阵。核心思路为:
- 计算第一行节点的最小路径和(其实就是数字本身,不用做处理)
- 从第二行开始,根据当前行与上一行,计算到每一行各个节点的最小路径和
- 找到最后一行中最小的路径和节点,即为这个三角形的最小路径和
例如刚才提到的三角形:
1 | 2 |
计算第二行
1 | (2) |
计算第三行
1 | (2) |
计算最后一行
1 | (2) |
通过取最后一行的最小值,即可获取最小路径和:9
题解
思路清晰之后直接上代码:
1 | class Solution: |