• 《剑指offer》 —— 青蛙跳台阶问题


    点击查看原文
    点击查看原题

    题目

    一只青蛙一次可以跳上(1)级台阶,也可以跳上(2)级台阶。求该青蛙跳上一个 (n)级的台阶总共有多少种跳法。

    答案需要取模 (1e9+7)(1000000007)),如计算初始结果为:(1000000008),请返回 (1)

    提示:(n) 的取值为 ([0, 100])

    解题思路

    (n) 级台阶的跳法为 (Sn)
    (n)(0) 时,(Smathop{{}} olimits_{{0}} = 1)
    (n)(1) 时,(Smathop{{}} olimits_{{1}} = 1)
    (n)(2) 时,(Smathop{{}} olimits_{{2}} = 2)
    (n)(3) 时,(Smathop{{}} olimits_{{3}} = 3)
    (n)(4) 时,(Smathop{{}} olimits_{{4}} = 5)
    ...
    当台阶数为 (n) 时,(Smathop{{}} olimits_{{n}}=Smathop{{}} olimits_{{n - 1}}+Smathop{{}} olimits_{{n-2}} ext{(}n ge 2 ext{)} )

    第一版代码

    根据上面推出的状态转移方程,我们很容易写出如下代码

    /**
     * @param {number} n
     * @return {number}
     */
    var numWays = function(n) {
        if (n === 0 || n === 1) {
            return 1
        }
        const mod = 1000000007
        const res = [1, 1]
        for (let i = 2; i <= n; i++) {
            res[i] = (res[i - 1] + res[i - 2]) % mod
        }
        return res[n]
    };
    

    优化代码

    在上面的代码中我们发现,res[i] 取决于 res[i - 1]res[i - 2],所以我们大可不必使用数组,直接改用三个变量也能将代码实现:

    /**
     * @param {number} n
     * @return {number}
     */
    var numWays = function(n) {
        if (n === 0 || n === 1) {
            return 1
        }
        const mod = 1000000007
        let first = 1
        let second = 1
        let res = 0
        for (let i = 2; i <= n; i++) {
            res = (first + second) % mod
            first = second
            second = res
        }
        return res
    };
    

    搜索「tony老师的前端补习班」关注我的微信公众号,那么就可以第一时间收到我的最新文章。

  • 相关阅读:
    linux压缩与解压
    simple 单例
    模板字符串
    变量的解构赋值
    let和const关键字
    React的基本认识
    Docker安装Nginx
    jenkins创建工程
    Jenkins系统初始化配置
    在CentOS上使用Docker镜像安装Jenkins
  • 原文地址:https://www.cnblogs.com/pigpigever/p/13695385.html
Copyright © 2020-2023  润新知