数据结构与算法之Leetcode-931. 下降路径最小和 - 力扣(动态规划)

49 篇文章 0 订阅
34 篇文章 0 订阅

931. 下降路径最小和 - 力扣(LeetCode)

  • 找出最短路径

    • 假定上一层的位置为[row,col]

    • 下一层的位置要满足以下条件:

      • [row+1,col-1],[row+1,col],[row+1,col+1]
    • 使用动态规划计算每一层的路径和,从底往上

      • 最左边
      • 最右边
      • dp[i][j]
class Solution {
    int MAX = Integer.MAX_VALUE;
    public int minFallingPathSum(int[][] mat) {
        int n = mat.length;
        int[][] f = new int[n][n];
        // 初始化:对于首行而言,每个位置的「最小成本」就是其「矩阵值」
        for (int i = 0; i < n; i++) f[0][i] = mat[0][i];
        // 从第二行开始,根据题目给定的条件进行转移
        for (int i = 1; i < n; i++) {
            for (int j = 0; j < n; j++) {
                int val = mat[i][j];
                f[i][j] = f[i - 1][j] + val;
                if (j - 1 >= 0) f[i][j] = Math.min(f[i][j], f[i-1][j-1] + val);
                if (j + 1 <  n) f[i][j] = Math.min(f[i][j], f[i-1][j+1] + val);
            }
        }
        int ans = MAX;
        for (int i = 0; i < n; i++) ans = Math.min(ans, f[n-1][i]);
        return ans;
    }
}
/**
 * @param {number[][]} matrix
 * @return {number}
 */
var minFallingPathSum = function(matrix) {
	let n = matrix.length;
  let f = new Array(n).fill(Number.MAX_SAFE_INTEGER).map(()=>new Array(n).fill(Number.MAX_SAFE_INTEGER));
  for(let i=0;i<n;i++){
    f[0][i] = matrix[0][i];
  }                   
  
  for(let i=1;i<n;i++){
    for(let j=0;j<n;j++){
      let val = matrix[i][j];
      f[i][j] = f[i-1][j] + val;
      if(j-1>=0){
        f[i][j] = Math.min(f[i][j],f[i-1][j-1]+val);
      }
      if(j+1<n){
        f[i][j] = Math.min(f[i][j],f[i-1][j+1]+val);
      }
    }
  }
  
  let ans = Number.MAX_SAFE_INTEGER
  for(let i=0;i<n;i++){
    ans = Math.min(ans,f[n-1][i])
  }
  return ans;
};
var minFallingPathSum = function(matrix) {
    let n = matrix.length;
    let dp = new Array(n).fill(Number.MAX_SAFE_INTEGER).map(()=>new Array(n).fill(Number.MAX_SAFE_INTEGER));
  

    for(let i=0; i<n; i++){
        for(let j=0; j<n; j++){
            // 边界
            if(i === 0){
                dp[i][j] = matrix[i][j];
            }else if(j === 0){
                // 最左边
                dp[i][j] = matrix[i][j] + Math.min(dp[i-1][j], dp[i-1][j+1]);
            }else if(j === n-1){
                // 最右边
                dp[i][j] = matrix[i][j] + Math.min(dp[i-1][j-1], dp[i-1][j]);
            }else{
                dp[i][j] = matrix[i][j] + Math.min(dp[i-1][j-1], dp[i-1][j], dp[i-1][j+1])
            }
        }
    }

    return dp[n-1].sort((a,b)=> a-b)[0];
};

执行结果:通过

执行用时:72 ms, 在所有 JavaScript 提交中击败了66.33%的用户

内存消耗:43.2 MB, 在所有 JavaScript 提交中击败了71.86%的用户

通过测试用例:49 / 49

参考链接

931. 下降路径最小和 - 力扣(LeetCode)

下降路径最小和 - 下降路径最小和 - 力扣(LeetCode)

JavaScript版解题思路 - 下降路径最小和 - 力扣(LeetCode)

DP - 路径问题 - LeetBook - 力扣(LeetCode)全球极客挚爱的技术成长平台

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值