LeetCode第64题:最小路径和

224 阅读1分钟

题干

给定一个包含非负整数的 *m* x *n* 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

**说明:**每次只能向下或者向右移动一步。

示例 1:

img

输入:grid = [[1,3,1],[1,5,1],[4,2,1]]
输出:7
解释:因为路径 13111 的总和最小。

解法:动规

这道题实际上是计算路径上的最小值,所以我们第一个想到的也是动态规划。

我们使用动规五部曲来分析以下整个流程:

1. 找到dp[i]数组以及下标的含义:dp[i][j]表示到达i,i位置的最小值。

2. 总结递推公式:因为我们只能向下或向右移动,所以我们的动规公式为dp[i][j]=min(dp[i-1][j],dp[i][j-1])+dp[i][j]

注意在两个边界时没有右或上的情况,所以要分类讨论

3. dp数组如何初始化:dp数组的尺寸应与gird数组相同

4.确定遍历的顺序:从零点处向后遍历

代码实现:

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

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

 var minPathSum = function (grid) {
    let m = grid[0].length;
    let n = grid.length;
    let dp = [...grid];
    for (let i = 0; i < n; i++) {
      for (let j = 0; j < m; j++) {
        if (i == 0 && j == 0) {
          continue
        }
        if (i == 0) {
          dp[i][j] = dp[i][j - 1] + dp[i][j]
          console.log()
        } else if (j == 0) {
          dp[i][j] = dp[i - 1][j] + dp[i][j]
        } else {
          dp[i][j] = dp[i][j] + Math.min(dp[i - 1][j], dp[i][j - 1])
        }
      }
    }
    return dp[n - 1][m - 1]
  };