持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第29天,点击查看活动详情🚀🚀
前言
今天的题目难度属于中等偏下的,还是比较有趣~
62. 不同路径 - 力扣(LeetCode)
代码实现
var uniquePaths = function(m, n) {
const dp = Array(m).fill().map(item => 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]
};
用昨天修言老师的思路,看到这种求路径总数,不要求具体路径,我们都可以采用动态规划的思想。再先用一种自顶向下的思想,站在终点倒退,找到状态转移方程。
收获
-
创建二维数组
const dp = Array(m).fill().map(item =>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
}
因为这种直来直去的走法只有一条路~自己写的时候也是这里没有想通
63. 不同路径 II - 力扣(LeetCode)
代码实现
var uniquePathsWithObstacles = function(obstacleGrid) {
let m = obstacleGrid.length;
let n = obstacleGrid[0].length
let dp = Array(m).fill(0).map(item => Array(n).fill(0))
for(let i = 0;i < m && obstacleGrid[i][0] == 0;i++){
dp[i][0] = 1;
}
for(let i = 0;i < n && obstacleGrid[0][i] == 0;i++){
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]
};
难点
- 二维数组
let m = obstacleGrid.length;
let n = obstacleGrid[0].length
let dp = Array(m).fill(0).map(item => Array(n).fill(0))
这样获取二维数组的长度和创建二维数组的方式还是不太熟练
- 障碍物的存在
把障碍物的存在想复杂了一点,它在这里只是影响了两个地方,一个就是初始化,一个就是状态转移方程。就是多加了一个条件而已了~