题目来源: LeetCode 75 30 天 JavaScript 挑战
198. 打家劫舍
思路
动态规划,每次求出跟上一步比较大的值,最后返回较大值。
代码
js
/**
* @param {number[]} nums
* @return {number}
*/
var rob = function(nums) {
if (!nums.length) {
return 0
}
let prev = 0
let curr = 0
for (let i = 0; i < nums.length; i++) {
let temp = Math.max(curr, nums[i] + prev)
prev = curr
curr = temp
}
return curr
};
790. 多米诺和托米诺平铺
思路
动态规划,每次需要处理 4 种状态
- 一个正方形都没有被覆盖,记为状态 0
- 只有上方的正方形被覆盖,记为状态 1
- 只有下方的正方形被覆盖,记为状态 2
- 上下两个正方形都被覆盖,记为状态 3 返回
dp[n]
的值
代码
js
/**
* @param {number} n
* @return {number}
*/
var numTilings = function(n) {
let M = 1e9 + 7
let dp = [1, 0, 0, 1]
for (let i = 2; i <= n; i++) {
const d0 = dp[3]
const d1 = (dp[0] + dp[2]) % M
const d2 = (dp[0] + dp[1]) % M
const d3 = (dp[0] + dp[1] + dp[2] + dp[3]) % M
dp = [d0, d1, d2, d3]
}
return dp[3]
};
62. 不同路径
思路
动态规划,从左上走到右下的方法等于,从右边开始走的路径总数加上从下边走的路径总数,动态方程为 dp[i][j] = dp[i-1][j]+dp[i][j-1]
。初始化数组,每次计算当前瓷砖数的走法,返回 dp[n - 1]
代码
js
/**
* @param {number} m
* @param {number} n
* @return {number}
*/
var uniquePaths = function(m, n) {
let dp = new Array(n).fill(1)
for (let i = 1; i < m; i++) {
for (let j = 1; j < n; j++) {
dp[j] = dp[j - 1] + dp[j]
}
}
return dp[n - 1]
};
本文完,感谢阅读。