剑指 Offer 10- II. 青蛙跳台阶问题

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

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

等价于斐波那契数列

注意 :f(0) = 1 , 因为不走也是一种方法

示例 1:

输入:n = 2 输出:2

示例 2:

输入:n = 7 输出:21

示例 3:

输入:n = 0 输出:1

题解

在这里插入图片描述

  • 第0级:一种方式,就是原地不动;
  • 第1级:1种方式,即从0走一步到第1级;
  • 第2级:2种方式,即从0到1到2,或者直接从0到2;
  • 第3级:考虑每次只能上1或者2级,那么到第三级只有两种情况:从第1级上两步到第3级,或者从第2级走一步到第三级。上面我们又计算了,到第1级只有一种方式,到第二级有2种方式,所以到第三级的方式就有:11+21=3。每一次从前一级或者前二级到当前级都只有一种方式,所以也可以写成:1+2=3。
    … …
    第n级:同上,到第n级只有两种方式:从n-2级走两步到第n级,或者从n-1级走一步到第n级。假设到第n-2级的方式有 f(n-2)种,到第n-1级的方式有f(n-1)种,则到第n级的方式有:f(n-2)*1+f(n-1)*1=f(n-2)+f(n-1)。

从上面分析可以看出,其实除了f(0)=1这个假设前提不同,后面的逻辑和斐波那契数列是一致的。因此求解这道题的逻辑就如下所

/* 第1级 走1步 第二级 走1步再走1步 | 走2步 第三级 走1步走1步走一步 | 走2步走1步 | 走1步走2步 第四级 走1步走1步走1步走1步 | 走2步走1走1 | 走2走2 | 走1走2走1 | 第n级是由第n-1级走1步 或 由第n-2级走2步 ; 得出结论: f(n) = f(n-1) + f(n-2) */ class Solution { public: int numWays(int n) { if(n < 2) return 1 ; int a =1 ,b = 1 ,sum ; for(int i = 0 ; i < n ; i ++){ sum = (a + b) % 1000000007 ; a = b ; b = sum ; } return a; } };

__EOF__

本文作者宋淇祥
本文链接https://www.cnblogs.com/qxsong/p/15837278.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   爪洼ing  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
点击右上角即可分享
微信分享提示

喜欢请打赏

扫描二维码打赏

支付宝打赏