120. 三角形最小路径和

动态规划

import java.util.List;

class Solution {
    public int minimumTotal(List<List<Integer>> triangle) {

        /**
         * 逆向思维 
         * 从下往上寻找最小路径,路径的条数越来越少,更容易找到
         * 假设最后一行下面还有一行,其值都为0,这样最后一行不用单独考虑
         * 首先从最下面一行出发,每个点初始路径大小就是本身
         * dp[i][j]定义为从最后一行往上到[i, j]这个点,经过的位置的最小和,即dp[i + 1][j]和dp[i + 1][j + 1]二者取最小值
         */
        int[][] dp = new int[triangle.size() + 1][triangle.size() + 1];

        for (int i = triangle.size() - 1; i >= 0; i--) {

            for (int j = 0; j <= i; j++) {
                dp[i][j] = Math.min(dp[i + 1][j], dp[i + 1][j + 1]) + triangle.get(i).get(j);
            }
        }

        /**
         * 循环结束后第一个点存储的就是所有路径中最短的那条
         */
        return dp[0][0];
    }
}

/**
 * 时间复杂度 O(n^2)
 * 空间复杂度 O(n^2)
 */

优化1——空间优化

import java.util.List;

class Solution {
    public int minimumTotal(List<List<Integer>> triangle) {

        /**
         * 每次从下往上找的过程中,只有当前行的结果会发生变化,已经遍历过的行不会再使用,因此可以使用一个一维数组循环覆盖
         * dp[j]定义为当前行正在变化的位置,比较的dp[j]和dp[j + 1]其实是下一行纵坐标相同的值
         */
        int[] dp = new int[triangle.size() + 1];

        for (int i = triangle.size() - 1; i >= 0; i--) {

            for (int j = 0; j <= i; j++) {
                dp[j] = Math.min(dp[j], dp[j + 1]) + triangle.get(i).get(j);
            }
        }
        
        return dp[0];
    }
}

/**
 * 时间复杂度 O(n^2)
 * 空间复杂度 O(n)
 */

https://leetcode-cn.com/problems/triangle/

posted @ 2022-01-20 14:43  振袖秋枫问红叶  阅读(35)  评论(0)    收藏  举报