zoukankan      html  css  js  c++  java
  • 《剑指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老师的前端补习班」关注我的微信公众号,那么就可以第一时间收到我的最新文章。

  • 相关阅读:
    男子头部胀痛案
    摩这些穴位可以对付突发的疾病
    跟师学习时的几个经验方
    黄褐斑良方--- 疏肺散斑汤
    食积咳嗽的特点
    牙痛用药口决(来源于网络暂未验证)
    20多年脚气起泡脱皮瘙痒外洗方治验案
    起死回生通关散
    腰突辩治心得(付济华)
    战痘良方--付济华
  • 原文地址:https://www.cnblogs.com/pigpigever/p/13695385.html
Copyright © 2011-2022 走看看