剑指Offer——II. 青蛙跳台阶问题(JS实现)

简介: 剑指Offer——II. 青蛙跳台阶问题(JS实现)

题目描述

image.png

解题思路一(暴力法)

  1. 当只有一级台阶的时候 F(1) = 1  只有一种跳法
  2. 当有两级台阶的时候 要么 1 + 1  要么 2  所以,F(2) = 2,此时有两种跳法
  3. 当台阶数大于2的时候,我们只用考虑最后一步的跳法
  4. 最后一步要么跳1步,要么跳2步
  5. 假设最后一步跳的是1步,则F(n) = F(n-1) + 1;
  6. 假设最后一步跳的是2步,则F(n) = F(n-2) + 1;
  7. 所以最后一步有这样的跳法 F(n) = F(n-1) + F(n-2);
  8. 最后得到的答案要取模 % 1000000007

解题代码一(超时,时间复杂度太高)

var numWays = function(n) {
    // 当只有一级台阶的时候 F(1) = 1  只有一种跳法
    // 当有两级台阶的时候 要么 1 + 1  要么 2  所以,F(2) = 2,此时有两种跳法
    // 当台阶数大于2的时候,我们只用考虑最后一步的跳法
    // 最后一步要么跳1步,要么跳2步
    // 假设最后一步跳的是1步,则F(n) = F(n-1) + 1;
    // 假设最后一步跳的是2步,则F(n) = F(n-2) + 1;
    // 所以最后一步有这样的跳法 F(n) = F(n-1) + F(n-2);
    // 最后得到的答案要取模 % 1000000007
    if (n === 1) return 1;
    if (n === 2) return 2;
    if (n === 0) return 1;
    return (numWays(n-1) + numWays(n-2)) % 1000000007
};

解题思路二(备忘录的方法)

上面的解法之所以会超时,原因在于上面存在两个递归,第二个递归和第一个递归走了重复的路,因此时间复杂度较高,下面我们采用备忘录的方法,所谓的备忘录的方法就是用一个数组将第一个递归走过的路记录下来,这样第二的递归可以直接用,这样时间复杂度就会降下来。

解题代码二

var numWays = function(n) {
    // ! 备忘录的方法
    // 定义一个备忘录
    // 这里之所以要n+1,就是要确保数组的最后一个元素的下标就是台阶数
    // 这里之所以填充负数,原因在于走法不可能是负数,用此来判断这个位置是否被遍历过
    const cache = new Array(n + 1).fill(-1);
    dfs(n,cache);
    return cache[n];
};
function dfs(n,cache) {
    // 下面的两个条件是递归的基础条件
    if (n <= 1) cache[n] = 1;
    if (n === 2) cache[n] = 2;
    // 下面的这个是用来判断该位置是否已经填充,如果已经填充则不需要继续了,直接返回即可
    if (cache[n] !== -1) return cache[n];
    cache[n] = (dfs(n - 1,cache) + dfs(n - 2,cache)) % 1000000007;
    return cache[n];
}

总结(本题给我们的启示思路)

  • 启示:学会使用备忘录数组的方法来记录已经递归过的元素,降低递归的时间复杂度。
相关文章
|
3月前
|
存储 JSON JavaScript
「offer来了」保姆级巩固你的js知识体系(4.0w字)
该文章提供了JavaScript知识体系的全面复习资料,覆盖了从基础语法到高级特性如闭包、原型链、异步编程等多个方面,并通过大量的面试题和实例代码帮助巩固理解。
「offer来了」保姆级巩固你的js知识体系(4.0w字)
|
7月前
|
JavaScript 前端开发
剑指 Offer 31. 栈的压入、弹出序列 (javascript实现)
剑指 Offer 31. 栈的压入、弹出序列 (javascript实现)
|
7月前
|
JavaScript 前端开发
JavaScript题解剑指offer : 09. 用两个栈实现队列
JavaScript题解剑指offer : 09. 用两个栈实现队列
46 0
|
JavaScript 前端开发 程序员
《剑指 Offer(第 2 版)》树部分JavaScript题解
《剑指 Offer(第 2 版)》树部分JavaScript题解
《剑指 Offer(第 2 版)》树部分JavaScript题解
|
存储 JavaScript 前端开发
《剑指 Offer (第 2 版)》链表部分 JavaScript 题解
《剑指 Offer (第 2 版)》链表部分 JavaScript 题解
《剑指 Offer (第 2 版)》链表部分 JavaScript 题解
|
JavaScript 算法 前端开发
【前端算法】JS实现数字千分位格式化
JS实现数字千分位格式化的几种思路,以及它们之间的性能比较
355 1
|
存储 前端开发 算法
一行代码解决LeetCode实现 strStr()使用JavaScript解题|前端学算法
一行代码解决LeetCode实现 strStr()使用JavaScript解题|前端学算法
165 0
一行代码解决LeetCode实现 strStr()使用JavaScript解题|前端学算法
|
存储 机器学习/深度学习 JavaScript
JS 你最少用几行代码实现深拷贝?
JS 你最少用几行代码实现深拷贝?
JS 你最少用几行代码实现深拷贝?
|
JavaScript 前端开发 算法
JavaScript实现一段时间之后关闭广告
简介:通过JavaScript实现在一段时间之后,广告消失。
136 0
JavaScript实现一段时间之后关闭广告
|
JavaScript 前端开发 算法
JS实现鼠标悬停变色
本文实现的是利用JS实现当鼠标悬停在表格上的时候,表格发生变色。 CSS渲染 JS逻辑 `
224 0
JS实现鼠标悬停变色