持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第13天,点击查看活动详情
刷题的日常-2022年10月10号
一天一题,保持脑子清爽
三角形最小路径和
来自leetcode的 120 题,题意如下:
给定一个三角形 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
理解题意
通过题意,我们可以将信息整理如下:
- 题目给定一个二维数组
- 二维数组的图形展示是个三角形
- 每一层比上一层多一个数
- 要求我们返回从顶层往下走的最小路径和
做题思路
其实就是入门的动态规划题,从第一层开始往下走,对每个位置进行判断,从上面有两个位置可以向下,我们只需要判断这两个位置代价比较小,取小的那个就可以了,步骤如下:
- 从上往下遍历
- 对每个位置,取出上一层位置的两个通路进行判断,将最小的路径更新到当前位置
- 返回最后一层中最小的代价即可
代码实现
代码实现如下:
public class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
List<Integer> pre = triangle.get(0);
for (int i = 1; i < triangle.size(); i++) {
List<Integer> current = triangle.get(i);
for (int idx = 0; idx < current.size(); idx++) {
current.set(idx, current.get(idx) + Math.min(get(pre, idx - 1, idx), get(pre, idx, idx - 1)));
}
pre = current;
}
int res = pre.get(0);
for (Integer num : pre) {
res = Math.min(res, num);
}
return res;
}
private int get(List<Integer> pre, int idx, int defIdx) {
if (idx < 0 || idx >= pre.size()) {
return pre.get(defIdx);
}
return pre.get(idx);
}
}