青蛙跳台阶问题|刷题打卡

282 阅读2分钟

掘金团队号上线,助你 Offer 临门! 点击 查看详情

一、题目描述

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

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

示例:

输入

n = 2

输出

2

限制

0 <= n <= 100

二、思路分析

我的思路

没想出来  ̄□ ̄|| 😂

最佳思路

我是万万没想到啊,这玩意竟然是个斐波那契数列。。。

这题目借助图片好理解些:

jump.png

  • 当跳n阶台阶的时候,因为只可以跳1步或者2步,所以最远的出发点就是n-2处,这里有n种跳法!
  • 在n-2处,青蛙可以选择跳1步或者2步:
    • 如果是跳2步 => 那么所有情况就是f(n-2)相等的,调到n-2台阶然后一跳2步到n
    • 如果是跳1步 => 那么所有的情况就不能看n-2的,就要去看n-1的。通过1步跳到n的,和f(n-1)情况是一样的。
  • 其实就是问题转化为:最后一跳会从哪些情况下跳过来。最后一跳要么2步,要么就1步,2步就是n-2点调过来的,1步就是n-1跳过来的(这2个各自涵盖了所有的情况,但是最后一跳到n却只有一种情况,所以总计就是f(n-1)+f(n-2))。
  • 我起先是没整明白是因为我把这2个加法认为是为了在f(n-2)基础上再看会有多少分支情况 加上了f(n-1),其实两个是完全独立不想干的!

三、AC 代码

代码其实很简单,就是斐波那契数列,当然还要注意一下题目要求,对1000000007取模。

题目还不能使用递归的方式,会报内存超标!

public int numWays(int n) {
    int pre = 1;
    int cur = 1;
    int tmp;
    for (int i = 0; i < n; i++) {
        tmp = cur;
        cur = (pre + cur) % 1000000007;
        pre = tmp;
    }
    return pre;
}

四、总结

这个题目就是套路题目了,刷过了印象就贼深,没刷过,不太好想。不过很有意思!