题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
规律发现
思路:简化问题可以从一级台阶开始分析,一级台阶只有一种跳法。如果有二级台阶的话,有两种跳法。以此类推,当台阶数量为n的时候(即f(n)),可以分两种情况:1.第一次跳一级台阶(f(n-1)) 2. 第一次跳两级台阶(f(n-2))。所以f(n) = f(n-1) + f(n-2)。
即为斐波那契数列。
代码展示
public class Solution {
public int JumpFloor(int n){
//当输入非正整数的时候返回0
if(n < 0)
return 0;
int[] a={0,1};
if(n<2)
return 1;
int FabOne=1;
int FabTwo=1;
int FabN=0;
for(int i=2;i<=n;i++){
FabN=FabOne+FabTwo;
FabOne=FabTwo;
FabTwo=FabN;
}
return FabN;
}
public static void main(String[] args) {
Solution fab=new Solution();
int f=fab.JumpFloor(20);
System.out.println(f);
}
}
运行结果显示
题目拓展
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法
规律发现
解法一:
当n=1时,f(1)=1。
当n大于1时,归纳总结可知:跳上n级台阶,第一次跳1级的话,有f(n-1)种方法;第一次跳2级的话,有f(n-2)种方法……第一次跳n-1级的话,有f(1)种方法;直接跳n级的话,有1种方法,所以可以得到如下公式:
f(n) = f(n-1)+f(n-2)+…f(1)+1 (n≥2)
f(n-1) = f(n-2)+f(n-3)+…f(1)+1 (n>2)
由上面两式相减可得,f(n)-f(n-1)=f(n-1),即f(n) = 2*f(n-1) (n>2)
最终结合f(1)和f(2),可以推得:f(n)=2^(n-1)
解法二:
除了必须到达最后一级台阶,第1级到第n-1级台阶都可以有选择的跳,也就是说对于这n-1个台阶来说,每个台阶都有跳上和不跳上2种情况,所以一共有2^(n-1)种方法。
代码展示
public class Solution {
public int JumpFloorII(int target) {
if(target < 0)
return 0;
if(target <= 1){
return 1;
}
int j1 = 2;
int j = 2;
for(int i = 2; i< target ;i++){
j = 2* j1;
j1 = j;
}
return j;
}
public static void main(String[] args) {
Solution jmp=new Solution();
int j=jmp.JumpFloorII(20);
System.out.println(j);
}
}
运行结果显示
题目拓展
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
规律发现
分析:同样是典型的递归问题。如下图所示,当尝试对2×n的大矩阵进行覆盖时,如果第一块小矩阵竖着放,相当于递归的求对2×(n-1)的矩阵的覆盖方法。
如果第一个矩阵横着放,则相当于求对2×(n-2)的矩阵的覆盖方法。得递推公式f(n)=f(n-1)+f(n-2)。考虑边界条件。
代码展示
public class N8矩形覆盖问题 {
public int RectCover(int target) {
if(target == 0 || target == 1 ||target == 2)
return target;
int temp1 =1;
int temp2 =2;
int res = 0;
for(int i = 3 ; i <= target ; i++){
res = temp1 + temp2;
temp1 = temp2;
temp2 = res;
}
return res;
}
}