持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第19天,点击查看活动详情
最近一直在力扣刷题,也逐渐对各类题型有了自己的理解,所谓见招拆招,将自己的浅显经验分享一下,帮助更多在编程路上的朋友们。
三角形最小路径和
给定一个三角形 triangle ,找出自顶向下的最小路径和。
每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1 。
示例 1:
输入: 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:
输入: triangle = [[-10]]
输出: -10
提示:
1 <= triangle.length <= 200triangle[0].length == 1triangle[i].length == triangle[i - 1].length + 1-104 <= triangle[i][j] <= 104
思路
本题需要根据三角形的值自顶向下寻找最小的路径和,这种题如果使用贪心会造成局部最优解的情况,所以需要考虑所有可能的情况,再找出最小的路径和。
dp.get(i)定义为从第 0 层到当前层的第 i 个节点的路径和,遍历到最后一层时 dp 列表所得为从第 0 层到最后一层的路径和。
对于当前层的 i 节点,最小路径和取min(上一层的i位置路径和, i - 1位置的路径和),如果是边界情况,就只能取上一位置的最小路径和。
题解
class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
int n = triangle.size();
List<Integer> dp = new ArrayList<>();
dp.add(triangle.get(0).get(0));
for(int i = 1; i < n; i++) {
List<Integer> tmp = new ArrayList<>();
for(int j = 0; j <= i; j++) {
if(j == 0) {
tmp.add(dp.get(0) + triangle.get(i).get(0));
}else if(j == i) {
tmp.add(dp.get(j - 1) + triangle.get(i).get(j));
}else {
int value = Math.min(dp.get(j), dp.get(j - 1));
tmp.add(triangle.get(i).get(j) + value);
}
}
dp = tmp;
}
int min = Integer.MAX_VALUE;
for(int value: dp) {
min = Math.min(min, value);
}
return min;
}
}