动态规划
62.不同路径 数论中的组合数
🔍 展开代码
JavaScript
var uniquePaths = function (m, n) {
// C_m+n-2^m-1
let cnt = 1;
for (let i = m + n - 2, j = 1; i > n - 1; i--, j++) {
cnt = cnt * i / j;
}
return Math.round(cnt);
};
63.不同路径 II 不难但磕绊
🔍 展开代码
JavaScript
/**
* @param {number[][]} obstacleGrid
* @return {number}
*/
var uniquePathsWithObstacles = function (obstacleGrid) {
const m = obstacleGrid.length;
const n = obstacleGrid[0].length;
const dp = Array.from({ length: m }, () => (
Array.from({ length: n }, () => 0)
))
dp[0][0] = obstacleGrid[0][0]===1?0:1;
for (let j = 1; j < n; j++) {
dp[0][j] = obstacleGrid[0][j] === 0 ? dp[0][j-1] : 0;
}
for (let i = 1; i < m; i++) {
dp[i][0] = obstacleGrid[i][0] === 0 ? dp[i-1][0] : 0;
}
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]
};
343.整数拆分 忘记初始化 dp 直接赋值报错
🔍 展开代码
JavaScript
/**
* @param {number} n
* @return {number}
*/
var integerBreak = function(n) {
const dp = [-1, -1, 1];
for(let i = 3; i <= n; i++){
dp[i] = -1;
for(let j = 1; j < i; j++){
dp[i] = Math.max(dp[i], dp[i-j] * j, (i - j) * j);
}
}
return dp[n];
};
96.不同的二叉搜索树 想不到的 DP 卡特兰数
🔍 展开代码
JavaScript
/**
* @param {number} n
* @return {number}
*/
var numTrees = function (n) {
const dp = new Array(n + 1).fill(0);
dp[0] = 1; dp[1] = 1;
for (let i = 2; i <= n; i++) {
for (let j = 1; j <= i; j++) {
dp[i] += dp[j - 1] * dp[i - j];
}
}
return dp[n];
};
JavaScript
/**
* @param {number} n
* @return {number}
*/
var numTrees = function(n) {
let c = 1;
for (let i = 0; i < n; i++) {
c = c * 2 * (2 * i + 1) / (i + 2);
}
return c;
};
337.打家劫舍 III 递归 + DP
🔍 展开代码
JavaScript
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number}
*/
var rob = function(root) {
function post(root){
if(!root){
return [0,0]
}
const left = post(root.left);
const right = post(root.right);
return [
Math.max(...left) + Math.max(...right),
root.val + left[0] + right[0]
]
}
return Math.max(...post(root))
};