45. 最小路径和【LC64】

115 阅读1分钟

题目

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

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

image.png

核心思路

1.预备二维DP表; 2.确认DP的是什么?求最小路径和,那就设为从[0,0]到每个节点的最小路径和 3.设置初始状态,左上角[0,0]步长 4.设置限制条件,只能向右向下走,因此存在i = 0或者j = 0 的两条边 5.DP: dp[i,j] = min{dp[i-1, j], dp[i, j-1]} + grid[i,j]

代码实例

var minPathSum = function (grid) {
  if (!grid) return -1;
  let row = grid.length;
  let col = grid[0].length;
  let dpArr = new Array(row).fill(0).map(item => {
    return new Array(col).fill(0)
  })
  //初始值
  dpArr[0][0] = grid[0][0]
  // dp[i,j] = min{dp[i-1, j], dp[i, j-1]} + grid[i,j]
  for (let i = 0; i < row; i++) {
    for (let j = 0; j < col; j++) {
      if (i === 0 && j === 0) {
        dpArr[0][0] = grid[0][0];
      } else if (i === 0 && j !== 0) {
        dpArr[i][j] = dpArr[i][j - 1] + grid[i][j];

      } else if (i !== 0 && j === 0) {
        dpArr[i][j] = dpArr[i - 1][j] + grid[i][j];
      } else {
        dpArr[i][j] = Math.min(dpArr[i][j - 1], dpArr[i - 1][j]) + grid[i][j];
      }
      //都不等于0
    }
  }
  return dpArr[row - 1][col - 1]
};