青蛙跳台阶以及斐波那契数列

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

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

示例 1:

输入:n = 2
输出:2

示例 2:

输入:n = 7
输出:21

示例 3:

输入:n = 0
输出:1

提示:

0 <= n <= 100



呜呜呜,我只是一只思维简单的青蛙,为什么要问我这么复杂的问题呢,我只直到如果只有1个台阶我直接跳一下就好了,2个台阶我跳两个一下或者一个两下,3个台阶跳三个一或一个一 一个二 再或者一个二一个一…详细点就是:
如果n=1,只有一种跳法,那就是1
如果n=2,有两种跳法,[2],[1,1]
如果n=3,有三种跳法,[1,1,1], [1,2], [2,1]
如果n=4,有五种跳法,[1,1,1,1], [1,1,2], [1,2,1], [2,1,1], [2,2]
如果n=5,有八种跳法,[1,1,1,1,1], [1,1,1,2], [1,1,2,1], [1,2,1,1], [2,1,1,1], [2,2,1], [2,1,2], [1,2,2]

列举的这么全名你能看出来斐波那契数列就好

但其实我是个聪明的青蛙,嘻嘻,如下倘如有5级台阶我要么直接从4级上跳一格上来,要么从3级上跳两格上来,没有别的方式了,因此我只要关心跳到4级的总方法数和跳到三级的总方法数,**这里我要强调的是你无论在4级还是在3级按照前面的路线走过来再去调到5级时就只有一种方法了,就是4跳1或者3跳2,你千万不要以为3跳1下跳到4再跳1下跳到5,这其实就是跟你在4级没有区别的,我所强调这样唯一的一种跳法与之前跳到3或者4的线路方案构成一条完整的线路,因而这里跳到4级的方案总数和跳的3级的方案总数就是答案!**同理在4级台阶上我要么从3级一下上来,要么2级上跳两格上来,依次类推,这是一个看上去递归的方案,但其实说是动态规划更好,因为3和4是5的子问题

在这里插入图片描述
在考虑过多个版本答案后我希望把这道题以斐波那契数列的角度去做可以得到一个最优秀解,首先我们不排除0级台阶,但是按力扣题解给出的0级台阶预期值是1我们就把它跟1级台阶放在一起,两种都是都只有1种跳法,其次很容易判断出2级有2种跳法,ok只要得到前两级的方案数目就好了,只要你知道上面那个结论,n-2和n-1的方案数之和一定是n的方案数,那么起始值为1级和2级的1和2,有多少级台阶就一直循环到多少级就好了

public class Solution {
    public int numWays(int n) {
        if (n == 0 || n == 1) {
            return 1;
        }
        int pre = 1, cur = 2;
        for (int i = 3; i <= n; i++) {
            int tmp = (pre + cur) % 1000_000_007;
            pre = cur;
            cur = tmp;
        }
        return cur;
    }
}

时间复杂度O(n) 空间复杂度O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值