动态规划
10- I. 斐波那契数列#
10- II. 青蛙跳台阶问题#
斐波拉契数列改版
F(0) = 0F(1) = 1F(2) = 2
F(n) = F(n-1) + F(n-2) + F(n-3)
- 常规 === 超时
return solution(n - 1) + solution(n - 2) + solution(n - 3)
- 动态规划
- 时间:
O(n)
空间:O(n)
- 时间:
function solution(n) { let dp = new Array(n); dp[0] = 0; dp[1] = 1; dp[2] = 2; for (let i = 3; i <= n; i++) { dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3]; } return dp[n];}
- 动态规划再优化
- 时间:
O(n)
空间:O(1)
- 时间:
function solution(n) { if (n < 3) return n; let a = 0, b = 1, c = 2, res; for (let i = 3; i <= n; i++) { d = a + b + c; a = b; b = c; c = res; } return res;}
322. 零钱兑换#
// const coins = [1, 2, 5], target = 120// dp[120] = Math.min(dp[119] + 1, dp[118] + 1, dp[115] + 1)// dp[i] = Math.min(dp[i - coins[0]] + 1, dp[i - coins[2]] + 1, ...)// dp[i] 表示总金额为 i 的时候最优解法的硬币数
function coinChange(coins, amount) { let dp = new Array(amount + 1).fill(Infinity); dp[0] = 0;
for (let i = 1; i <= amount; i++) { for (let coin of coins) { if (i - coin >= 0) { dp[i] = Math.min(dp[i], dp[i - coin] + 1); } } }
return dp[amount] === Infinity ? -1 : dp[amount];}
20. 有效的括号#
var isValid = function(s) { if(s.length %2 !== 0) return false // 后进先出
//用字典映射大小括号,采用栈顶元素与当前元素比较,匹配则抵消,继续下一个,不匹配则return false;如果循环完毕,看栈中是为空;为空则完全匹配,否则为无效;
let stack = [] const map = new Map() map.set('(',')') map.set('[',']') map.set('{','}') for(let i = 0;i<s.length;i++){ if(map.has(s[i])){ // has属性主要针对的是键 stack.push(s[i]) }else{ const stackTop = stack[stack.length - 1] if(map.get(stackTop) === s[i]){ stack.pop() }else{ return false } } } // 判断标准为最后是不是为空 return stack.length === 0;};