掘金团队号上线,助你 Offer 临门! 点击 查看详情
一、题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
示例:
输入
n = 2
输出
2
限制
0 <= n <= 100
二、思路分析
我的思路
没想出来  ̄□ ̄|| 😂
最佳思路
我是万万没想到啊,这玩意竟然是个斐波那契数列。。。
这题目借助图片好理解些:
- 当跳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;
}
四、总结
这个题目就是套路题目了,刷过了印象就贼深,没刷过,不太好想。不过很有意思!