算法练习day34

67 阅读1分钟

一、不同路径

五部曲

  1. 确定dp数组,dp[i][j]表示从0,0出发到i,j的不同路径
  2. 确定地推公式,从两个方向dp[i][j] = dp[i-1][j] + dp[i][j-1]
  3. dp初始化,dp[i][0]和dp[0][j]一定都是1
  4. 遍历顺序,从左向右
  5. 举例推到dp数组
/**
 * @param {number} m
 * @param {number} n
 * @return {number}
 */
var uniquePaths = function(m, n) {
    let dp = new Array(m).fill(0).map(_ => new Array(n).fill(0))
    for(let i = 0;i < m;i++) {
        dp[i][0] = 1
    }
    for(let i = 0;i < n;i++) {
        dp[0][i] = 1
    }
    for(let i = 1; i<m;i++) {
        for(let j = 1;j < n;j++) {
            dp[i][j] = dp[i-1][j] + dp[i][j-1]
        }
    }
    return dp[m - 1][n-1]
};

二、不同路径2

遇到障碍物不进行计算,保持初始值0

/**
 * @param {number[][]} obstacleGrid
 * @return {number}
 */
var uniquePathsWithObstacles = function(obstacleGrid) {
    let m = obstacleGrid.length
    let n = obstacleGrid[0].length
    let dp = new Array(m).fill(0).map(_ => new Array(n).fill(0))
    for(let i = 0; i < m;i++) {
        if(obstacleGrid[i][0] !== 0) {
           break
        }
         dp[i][0] = 1
    }
    for(let i = 0; i < n;i++) {
        if(obstacleGrid[0][i] !== 0) {
           break
        }
         dp[0][i] = 1
    }
    for(let i = 1; i < m;i++) {
        for(let j = 1; j < n; j++) {
            if(obstacleGrid[i][j] === 0) {
                dp[i][j] = dp[i-1][j] + dp[i][j-1]
            }
        }
    }
    return dp[m-1][n-1]
};