传送门:
斐波那契数列相关问题思路详解:【Java实现】剑指Offer10.1/10.2——斐波那契数列/青蛙跳台阶:三种思路分享
这道题可以变成斐波那契一样的题,只不过条件(F(0)
不同)有一丢丢变化,剩下的完全一样
这篇主要讲如何转化成斐波那契数列问题。
思路
跳到第n
级台阶,上一步可能跳了1级,或者跳了2级,所以分成两种情况:
- 如果上一步是1,那么之前的
n-1
步,有多少种方法? - 如果上一步是2,那么之前的
n-2
步,有多少种方法?
因此:
f(n)=f(n-1)+f(n-2)
这里理解了的话, 就成功转化为了斐波那契数列问题,也就是相同的三种思路
下面放代码:
方法1:中间变量
class Solution {
public int numWays(int n) {
//if(n==0) return 1;
if(n<=1) {
return 1;
}
if(n==2) {
return 2;
}
int a=2,b=1,ans=1;
for(int i=3;i<=n;i++) {
ans=(a+b)%1000000007;
b=a;
a=ans;
}
return ans;
}
}
方法2:数组
class Solution {
public int numWays(int n) {
//if(n==0) return 1;
if(n<=1) {
return 1;
}
if(n==2) {
return 2;
}
int[] ans=new int[n+1];
ans[0]=0;
ans[1]=1;
ans[2]=2;
for(int i=3;i<=n;i++) {
ans[i]=(ans[i-1]+ans[i-2])%1000000007;
}
return ans[n];
}
}