写点什么

【LeetCode】三角形最小路径和 Java 题解

作者:Albert
  • 2022-11-06
    北京
  • 本文字数:1293 字

    阅读完需:约 4 分钟

题目描述

给定一个三角形 triangle ,找出自顶向下的最小路径和。


每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1 。


示例 1:
输入:triangle = [[2],[3,4],[6,5,7],[4,1,8,3]]输出:11解释:如下面简图所示: 2 3 4 6 5 74 1 8 3自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。
示例 2:
输入:triangle = [[-10]]输出:-10
来源:力扣(LeetCode)链接:https://leetcode.cn/problems/triangle著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
复制代码

思路分析

  • 今天的算法题目是数组形式的三角形题目。分析题目,题目要求找出自顶向下的最小路径和。并且规定了查找的路径,查找的路径是每一步只能移动到下一行中相邻的结点上。

  • 这个题目最容易想到的是,朴素遍历每一种路径,求出每一种路径的和,比较最小值,朴素的算法的时间复杂度比较高。

  • 这里比较容易想到的优化朴素算法的思路是,采用模拟的方式,逐层求解当层的最小值,然后累加求和。这个思路实际是求局部的最小值,局部的最优解累加起来,不一定是全局的最优解。

  • 那这个题目的应该如何去求解呢?解决这类题目,我们一般采用 DP。DP 全称是 Dynamic Programming, 是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。具体到这个题目就是,子问题就是我们每次求解最小路径和,而每个最小路径和,和当前的值,以及相邻的节点值有关。我们用 dp[i][j] 表示从三角形顶部走到位置 (i, j)的最小路径和, 动态转移方程是 dp[i][j]=min(dp[i−1][j−1],dp[i−1][j]) + triangle[i][j], 初始化 dp[0][0] = triangle[0][0]。这里我们采用 dp[i][j] 表示每次计算的最优解,和上面的具体求解不同,需要特别注意。

  • 明确了转移方程,有一些特殊情况,当 j=0,dp[i-1][j-1] 没有意义。当 j=i 时,dp[i-1][j]没有意义。我们需要做一些特殊的处理。具体的实现代码如下,供参考。

通过代码

class Solution {    public int minimumTotal(List<List<Integer>> triangle) {        int n = triangle.size();        int[][] dp = new int[n][n];        dp[0][0] = triangle.get(0).get(0);                for (int i = 1; i < n; i++) {            dp[i][0] = dp[i - 1][0] + triangle.get(i).get(0);            for (int j = 1; j < i; j++) {                dp[i][j] = Math.min(dp[i - 1][j - 1], dp[i - 1][j]) + triangle.get(i).get(j);            }
dp[i][i] = dp[i - 1][i - 1] + triangle.get(i).get(i); }
int ans = dp[n - 1][0]; for (int i = 1; i < n; i++) { ans = Math.min(ans, dp[n - 1][i]); } return ans; }}
复制代码

总结

  • 上述算法的时间复杂度是 O(n * n),空间复杂度是 O(n * n)

  • DP 相关的题目需要一定的思考能力,遇到相关的题目,我们可以多做几次练习,加深理解,掌握好 DP。

  • 坚持算法每日一题,加油!

发布于: 刚刚阅读数: 3
用户头像

Albert

关注

数据结构和算法爱好者 2019-09-29 加入

LeetCode,略懂后端的RD

评论

发布
暂无评论
【LeetCode】三角形最小路径和Java题解_算法_Albert_InfoQ写作社区