【JS每日一算法】58.最小路径和(动态规划)

144 阅读1分钟

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

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

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 200
  • 0 <= grid[i][j] <= 200

示例:

minpath.jpg

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

题解:

更多JS版本题解点击链接关注该仓库👀

/**
 * @description: 动态规划  TC:O(n^2)   SC:O(n^2)
 * @author: JunLiangWang
 * @param {*} grid  给定m*n的网格
 * @return {*}
 */
function dp(grid){
    
    /**
     * 该方案使用动态规划的方式,定义一个m*n的矩阵(DPArray),其中矩阵的
     * 某一个元素,例如DPArray[i][j]表示到达i行j列(记作[i,j])的最小和,
     * 已知每次只能向下/向右移动一步,因此到达[i,j]的最小和就等于[i,j]
     * 的当前值加上(到达上一格[i-1,j]的最小和与到达左一格[i,j-1]的最小和
     * 的最小值),即:
     *    DPArray[i][j]=grid[i][j]+Min(DPArray[i-1][j],DPArray[i][j-1])
     * 最终DPArray最后一个元素则为达到终点的最小和。
     * 
     * 后面的代码中我之所以是定义(m+1)*(n+1)的矩阵(DPArray),是因为考虑到
     * 能够方便获取到DPArray[i-1][j]与DPArray[i][j-1]的值。
     * 
     */

    // 定义一个(m+1)*(n+1)的矩阵
    let m=grid.length,n=grid[0].length,
    DPArray=new Array(m+1).fill(0).map(()=>new Array(n+1).fill(Infinity));
    // 赋值[0,1]元素为0,
    DPArray[0][1]=0;
    
    // 从(1至m,1至n)遍历数组
    for(let i=1;i<=m;i++){
        for(let j=1;j<=n;j++){
            // 到达[i,j]的最小和就等于[i,j]的当前值加上(到达上一格[i-1,j]的
            // 最小和与到达左一格[i,j-1]的最小和的最小值)
            DPArray[i][j]=grid[i-1][j-1]+Math.min(DPArray[i-1][j],DPArray[i][j-1]);
        }
    }

    // 返回结果
    return DPArray[m][n];
}

来源:力扣(LeetCode)