一、不同路径
五部曲
- 确定dp数组,
dp[i][j]表示从0,0出发到i,j的不同路径 - 确定地推公式,从两个方向
dp[i][j] = dp[i-1][j] + dp[i][j-1] - dp初始化,
dp[i][0]和dp[0][j]一定都是1 - 遍历顺序,从左向右
- 举例推到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]
};