题目来源: LeetCode 75 30 天 JavaScript 挑战
216. 组合总和 III
思路
回溯法,从 1 开始,使用一个数组表示数字组合,递归的终止条件是数组长度等于 k
, 如果数组和 sum
等于 n
那么就将这个数组添加到最终结果去。
代码
js
/**
* @param {number} k
* @param {number} n
* @return {number[][]}
*/
var combinationSum3 = function(k, n) {
const res = []
let start = 1
const back = (path, start, sum) => {
if (path.length === k) {
if (sum === n) {
res.push(path.slice(0))
}
return
}
console.log(path)
for (let i = start; i <= 9; i++) {
path.push(i)
back(path, i + 1, sum + i)
path.pop()
}
}
back([], start, 0)
return res
};
1137. 第 N 个泰波那契数
思路
动态规划,直接递归会超时,所以需要缓存计算结果,使用 4 个变量缓存计算结果,返回前三个数的和。
代码
js
// 超时
// var tribonacci = function(n) {
// let t0 = 0
// let t1 = 1
// if (n === 0) {
// return t0
// }
// if (n < 3) {
// return t1
// }
// return tribonacci(n - 3) + tribonacci(n - 2) + tribonacci(n - 1)
// };
/**
* @param {number} n
* @return {number}
*/
var tribonacci = function(n) {
if (n === 0) {
return 0
}
if (n <= 2) {
return 1
}
let t0 = 0
let t1 = 0
let t2 = 1
let tn = 1
for (let i = 3; i <= n; i++) {
t0 = t1
t1 = t2
t2 = tn
tn = t0 + t1 + t2
}
return tn
};
746. 使用最小花费爬楼梯
思路
动态规划,先声明前两步的花费,从 2 开始计算到楼梯顶每次花费较小的值,然后更新前两步的花费,返回最后一步的花费值即可。
代码
js
/**
* @param {number[]} cost
* @return {number}
*/
var minCostClimbingStairs = function(cost) {
let dp0 = 0
let dp1 = 0
for (let i = 2; i <= cost.length; i++) {
const next = Math.min(dp1 + cost[i - 1], dp0 + cost[i - 2])
dp0 = dp1
dp1 = next
}
return dp1
};
本文完,感谢阅读。