今天開始逐漸有 dp的感覺了,前 兩題 不同路徑,可以好好研究一下,適合進階
詳細布置
62.不同路徑
本題大家掌握動態規劃的方法就可以。 數論方法 有點非主流,很難想到。
https://programmercarl.com/0062.不同路徑.html
影片講解:https://www.bilibili.com/video/BV1ve4y1x7Eu
/**
* @param {number} m
* @param {number} n
* @return {number}
*/
var uniquePaths = function(m, n) {
const dp = new Array(m).fill(1).map(()=>new Array(n).fill(1));
// for (let i=0;i<n;i++) {
// dp[0][i] = 1;
// }
// for (let i=0;i<m;i++) {
// dp[i][0] = 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];
};
- 不同路徑 II
https://programmercarl.com/0063.不同路徑II.html
影片講解:https://www.bilibili.com/video/BV1Ld4y1k7c6
這題要注意初始化的時候,如果障礙物在第一行或第一列,,障礙物後面的值都為0
/**
* @param {number[][]} obstacleGrid
* @return {number}
*/
var uniquePathsWithObstacles = function(obstacleGrid) {
if (obstacleGrid[0][0] === 1) return 0;
let m = obstacleGrid.length;
let n = obstacleGrid[0].length;
const dp = new Array(m).fill(0).map(()=>new Array(n).fill(0));
for(let i=0;i<m;i++) {
if (obstacleGrid[i][0]===1) {
dp[i][0] = 0;
break;
} else {
dp[i][0] = 1;
}
}
for(let i=0;i<n;i++) {
if (obstacleGrid[0][i]===1) {
dp[0][i] = 0;
break;
} else {
dp[0][i] = 1;
}
}
for (let i=1;i<m;i++) {
for(let j =1;j<n;j++) {
if (obstacleGrid[i][j]===1) {
dp[i][j] = 0;
} else {
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
}
return dp[m-1][n-1];
};
- 整數拆分 (可跳過)
本題思路並不容易想,一刷建議可以跳過。如果學有餘力,可以看影片理解一波。
https://programmercarl.com/0343.整數拆分.html
影片講解:https://www.bilibili.com/video/BV1Mg411q7YJ
96..不同的二叉搜尋樹 (可跳過)
本題思路並不容易想,一刷建議可以跳過。 如果學有餘力,可以看影片理解一波。
https://programmercarl.com/0096.不同的二叉搜尋樹.html
影片講解:https://www.bilibili.com/video/BV1eK411o7QA