• [LeetCode] 120. Triangle


    Given a triangle array, return the minimum path sum from top to bottom.

    For each step, you may move to an adjacent number of the row below. More formally, if you are on index i on the current row, you may move to either index i or index i + 1 on the next row.

    Example 1:

    Input: triangle = [[2],[3,4],[6,5,7],[4,1,8,3]]
    Output: 11
    Explanation: The triangle looks like:
       2
      3 4
     6 5 7
    4 1 8 3
    The minimum path sum from top to bottom is 2 + 3 + 5 + 1 = 11 (underlined above).
    

    Example 2:

    Input: triangle = [[-10]]
    Output: -10

    Constraints:

    • 1 <= triangle.length <= 200
    • triangle[0].length == 1
    • triangle[i].length == triangle[i - 1].length + 1
    • -104 <= triangle[i][j] <= 104

    Follow up: Could you do this using only O(n) extra space, where n is the total number of rows in the triangle?

    三角形最小路径和。

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

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

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/triangle
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    首先将数组变成一个直角三角形这样易于理解。

    [2]

    [3,4]

    [6,5,7]

    [4,1,8,3]

    思路是自下而上的动态规划,我参考了这个帖子。题目求的是自上而下的最小路径和,那么也就意味着在每两个相邻的数字之间,要找出一个相对小的数字,才有可能使得整个路径最小,但是如果自上而下这样找的话,其实并不一定能找到整个路径最小的。所以这里创建一个长度为 triangle.size() + 1 的数组记录最后动态规划的结果。从最后一行开始扫描,在 DP 数组的每一个位置上的值是当前位置 i 的数字 + DP数组里面 dp[i] 和 dp[i + 1] 的较小的值。最后返回的是 dp[0]。图示如下

    时间O(n^2)

    空间O(n)

    Java实现

     1 class Solution {
     2     public int minimumTotal(List<List<Integer>> triangle) {
     3         int[] res = new int[triangle.size() + 1];
     4         for (int i = triangle.size() - 1; i >= 0; i--) {
     5             for (int j = 0; j < triangle.get(i).size(); j++) {
     6                 res[j] = Math.min(res[j], res[j + 1]) + triangle.get(i).get(j);
     7             }
     8         }
     9         return res[0];
    10     }
    11 }

    JavaScript实现

     1 /**
     2  * @param {number[][]} triangle
     3  * @return {number}
     4  */
     5 var minimumTotal = function(triangle) {
     6     // corner case
     7     if (triangle === null || triangle.length === 0) {
     8         return 0;
     9     }
    10 
    11     // normal case
    12     let res = new Array(triangle.length + 1).fill(0);
    13     for (let i = triangle.length - 1; i >= 0; i--) {
    14         for (let j = 0; j < triangle[i].length; j++) {
    15             res[j] = Math.min(res[j], res[j + 1]) + triangle[i][j];
    16         }
    17     }
    18     return res[0];
    19 };

    相关题目

    118. Pascal's Triangle

    119. Pascal's Triangle II

    120. Triangle

    LeetCode 题目总结

  • 相关阅读:
    linux 服务器---FastDFS分布式文件服务器配置
    JFinal getModel方法(从页面表单中获取Model对象)+数据库存储问题
    实现Callable接口。带返回值的线程
    Spring 自动化装配Bean
    Spring--基于代理类ProxyFactoryBean的AOP实现
    Jfinal中的validator理解/详解
    Jfinal中的文件上传
    HotSpot学习(二):虚拟机的启动过程源码解析
    HotSpot学习(一):编译、启动与调试
    Netty的对象池
  • 原文地址:https://www.cnblogs.com/cnoodle/p/13230315.html
Copyright © 2020-2023  润新知