刷题的日常-三角形最小路径和

90 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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);
    }
}

image.png