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 @   振袖秋枫问红叶  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示