动态规划——LeetCode120三角形最小路径和

给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点(容易理解错)上。

  • 例如,给定三角形:

[
    [2],
   [3, 4],
  [6, 5, 7],
 [4, 1, 8, 3]
]
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。

说明:
如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分。

class Solution {
    public int minimumTotal(List<List<Integer>> tri) {
        //自底向上的动态规划
        int[][] dp = new int[tri.size()+1][tri.size()+1];  //多增加一行和一列可以省去初始化dp[tri.size()-1]这一行
        
        for(int i = tri.size() - 1; i >= 0; i--){
            for(int j = 0; j < tri.get(i).size(); j++){
                dp[i][j] = tri.get(i).get(j) + Math.min(dp[i+1][j], dp[i+1][j+1]);  //相邻的两个数
            }
        }
        return dp[0][0];
    }
}
//优化空间复杂度,仅使用一维数组
class Solution {
    public int minimumTotal(List<List<Integer>> tri) {
        //自底向上的动态规划
        int[] dp = new int[tri.size()+1];
        
        for(int i = tri.size() - 1; i >= 0; i--){
            for(int j = 0; j < tri.get(i).size(); j++){
                //一维数组保存这一层的数的三角形最小路径和,其中dp[j]与dp[j+1]代表相邻的两数
                dp[j]= Math.min(dp[j],dp[j+1]) + tri.get(i).get(j) ;
            }
            //System.out.println(i + " - " + dp[i]);
        }
        return dp[0];
    }
}

执行用时 : 5 ms, 在Triangle的Java提交中击败了74.78% 的用户
内存消耗 : 36.7 MB, 在Triangle的Java提交中击败了84.22% 的用户

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值