青蛙跳台阶问题
1、一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)【简单】
此类问题可以通过找规律得出结果,如下图所示:
台阶 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
方法数 | 1 | 2 | 3 | 5 | 8 |
可以看出ff(n)=f(n-1)+f(n-2),这里可以用递归的方法解出问题,参考代码:
public int solution(int num){
int result = 0;
if(num == 1){
return 1;
}else if(num == 2){
return 2;
}else{
result = solution(num-1)+solution(num-2);
}
return result;
}
变态青蛙跳台阶问题
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。【简单】
两道题的解题思路都是一样的,通过规律可以找出问题的答案
观察下表:
台阶 | 1 | 2 | 3 | 4 |
---|---|---|---|---|
方法数 | 1 | 2 | 4 | 8 |
可以看出变态版本的跳台阶规律为:f(n)=2^(n-1)
这样很容易通过代码实现,如下所示:
public int JumpFloorII(int target){
int result = 1;
if(target > 1){
/**
* 这里使用了移位操作代替平方操作,提高运行速率,2的二进制向右移位,2的二进制是0010,
* 例如要2次方,则变成0100,向右移(2-1)位,青蛙跳台阶是2^(n-1),换成二进制运算则要向右
* 移(n-1-1)=(n-2)位
*/
result = 2 << (target - 2);
}
return result;
}
这里不是通过传统的乘方运算进行编码,而是采用二进制移位的方式 ,提高运行速率,2的二进制向右移位,2的二进制是0010,例如要2次方,则变成0100,向右移(2-1)位,青蛙跳台阶是2^(n-1),换成二进制运算则要向右移(n-1-1)=(n-2)位。