【题目】
给定整数N,代表台阶数,一次可以跨2个或者1个台阶,返回有多少种走法。
【举例】
N=3,可以三次都跨1个台阶;也可以先跨2个台阶,再跨1个;或者先跨1个,再跨2个。所以有三种走法,返回3.
【代码】
public static void main(String[] args) {
//进阶1
System.out.println(s1(5));//8 (1,2,3,5,8,12)
System.out.println(s2(5));//8
System.out.println(s3(5));//8
}
//给定台阶数,返回走法数
//方法1:暴力递归,O(2^N)
public static int s1(int n){
if(n<1){
return -1;
}
if(n==1||n==2){
return n;
}
//最后跳上第N级的情况,要么是从N-2级直接跨2级跳上,要么是从N-1级跨1级跳上
//故 s(n)=s(n-1)+s(n-2)
//类似斐波那契数列,唯一的不同是初始项不同
return s1(n-1)+s1(n-2);
}
//方法2:依次从左到右求出每一项的值,O(N)
public static int s2(int n){
if(n<1){
return -1;
}
if(n==2||n==1){
return n;
}
int res=2;//初始第二项
int pre=1;//初始第一项
int temp=0;
for(int i=3;i<=n;i++){
temp=res;
res=res+pre;
pre=temp;
}
return res;
}
//方法3:矩阵乘法思想,O(logN)
//(s(n),s(n-1))=(2,1)×{{1,1},{1,0}}^(n-2)
public static int s3(int n){
if(n<1){
return -1;
}
if(n==2||n==1){
return n;
}
int[][] base={{1,1},{1,0}};
int[][] res=matrixPower(base,n-2);//状态矩阵的n-2次方
return 2*res[0][0]+res[1][0];
}
【题目】 (青蛙变态跳)
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
【思路】
假设跳上第n个台阶有f(n)种方法,则f(1)=1,f(2)=2,f(3)=4,f(4)=8,我们隐约感觉到f(n)=2^(n-1)。但是需要证明下,同样根据我们根据上篇文章中跳台阶的思路,可以得到f(n)=f(n-1)+f(n-2)+….+f(1)+1,而f(n-1)=f(n-2)+….+f(1)+1,两个式子相减,得到f(n) = 2f(n-1),很明显可以得到f(n)=2^(n-1)。
【代码】
public int JumpFloorII(int target) {
if(target<=0) return 0;
if(target==1) return 1;
int res=1;
while(--target!=0){
res*=2;
}
return res;
}