您的位置:首页 > Web前端

剑指offer-跳台阶and变态跳台阶and矩形覆盖-Java

2018-03-23 08:56 525 查看
1.跳台阶
题目描述:
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

思路解析:
跳台阶问题是斐波那契数列,所以还是比较简单的,把前面几种情况列出来以后,然后使用for循环就可以写出来了。
代码:public class Solution {
public int JumpFloor(int target) {
if(target == 0)
return 0;
else if(target == 1){
return 1;
}else if(target == 2){
return 2;
}
else if(target == 3){
return 3;
}
int a=2;
int b=3;
int c=0;
for(int i=4;i<=target;i++){
c=a+b;
a=b;
b=c;
}
return c;
}
}2.变态跳台阶
题目描述:
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

思路解析:
f(1)=1;
f(2)=2;
f(3)=4
f(4)=f(1)+f(2)+f(3)=2f(3)
f(5)=f(1)+f(2)+f(3)+f(4)=2f(4)
f(n)=2f(n-1)=2*2*f(n-2)=……=2^n
代码:public class Solution {
public int JumpFloorII(int target) {
if(target<=0){
return 0;
}else if(target==1){
return 1;
}else if(target==2){
return 2;
}else if(target==3){
return 4;
}
int a=4;
for(int i=4;i<=target;i++){
a=a*2;
}
return a;
}
}3.矩形覆盖
题目描述:
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?

思路解析:
第一种是竖着放置,剩下的就是f(n-1)种方法了,第二种是横着放置,就是f(n-2)种方法了。递归和循环的方法,也是分治法。图片来自https://blog.csdn.net/fengsser/article/details/46691801



代码:public class Solution {
public int RectCover(int target) {
if(target<=0){
return 0;
}else if(target==1){
return 1;
}else if(target ==2){
return 2;
}
int a=1;
int b=2;
int c=0;
for(int t = 3;t<=target;t++){
c=a+b;
a=b;
b=c;
}
return c;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: