三角形最小路径和
题目描述
原题链接:120. 三角形最小路径和 - 力扣(LeetCode)
给定一个三角形 triangle
,找出自顶向下的最小路径和。
每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i
,那么下一步可以移动到下一行的下标 i
或 i + 1
。
示例 1:
1 2 3 4 5 6 7 8
| 输入:triangle = [[2],[3,4],[6,5,7],[4,1,8,3]] 输出:11 解释:如下面简图所示: 2 3 4 6 5 7 4 1 8 3 自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。
|
示例 2:
1 2
| 输入:triangle = [[-10]] 输出:-10
|
提示:
1 <= triangle.length <= 200
triangle[0].length == 1
triangle[i].length == triangle[i - 1].length + 1
-104 <= triangle[i][j] <= 104
进阶:
- 你可以只使用
O(n)
的额外空间(n
为三角形的总行数)来解决这个问题吗?
解题思路
两种思路:
1.自底向上:定义集合f[i] [j]为从下到上走到当前路径的最小路径和
状态转移方程:f[i] [j] = min(f[i+1] [j], f[i+1] [j+1]) + triangle[i-1] [j-1]
初态:f[0i] [0j] = 0
2.自顶向下:定义集合f[i] [j]为从上到下走到当前路径的最小路径和
状态转移方程:f[i] [j] = min(f[i-1] [j], f[i-1] [j+1]) + triangle[i-1] [j-1]
初态:f[0i] [0j] = MAX
代码
自底向上
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| class Solution { public int minimumTotal(List<List<Integer>> triangle) { int n = triangle.size(); int m = triangle.get(n-1).size(); int[][] f = new int[n+10][m+10]; for(int i = n; i >= 1; i--){ for(int j = 1; j <= i; j++){ int tmp = triangle.get(i-1).get(j-1); f[i][j] = Math.min(f[i+1][j], f[i+1][j+1]) + tmp; } } return f[1][1]; } }
|
AC记录:
自顶向下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| class Solution { public int minimumTotal(List<List<Integer>> triangle) { int n = triangle.size(); int m = triangle.get(n-1).size(); int[][] f = new int[n+10][m+10]; for(int i = 1; i <= n; i++){ for(int j = 1; j <= i; j++){ int tmp = triangle.get(i-1).get(j-1); if(j == 1) f[i][j] = f[i-1][j] + tmp; else if(j == i) f[i][j] = f[i-1][j-1] + tmp; else f[i][j] = Math.min(f[i-1][j], f[i-1][j-1]) + tmp; } } int ans = 10008; for(int i = 1; i <= m; i++){ ans = Math.min(ans, f[n][i]); } return ans; } }
|
AC记录:
从AC记录上看两种代码效率差不多,可是自顶向下的要代码书写要复杂一些,所以说代码优化我们只选取自底向上来优化(自顶向下的优化也差不多)
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| class Solution { public int minimumTotal(List<List<Integer>> triangle) { int n = triangle.size(); int m = triangle.get(n-1).size(); int[] f = new int[n+10]; for(int i = n; i >= 1; i--){ for(int j = 1; j <= i; j++){ int tmp = triangle.get(i-1).get(j-1); f[j] = Math.min(f[j], f[j+1]) + tmp; } } return f[1]; } }
|
AC记录
至此此题完毕。