四道题:
1、Fibonacci数列;
class Solution {
public:
int Fibonacci(int n) {
if(n<=1)
return n==0?0:1;
int op1=0,op2=1;
int res=0;
for(int i=2;i<=n;++i)
{
res=op1+op2;
op1=op2;
op2=res;
}
return res;
}
};
2、青蛙跳:一次1节或2节;
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
class Solution {
public:
int jumpFloor(int number) {
//number=1,1种跳法
//number=2,2中跳法;一次跳一阶,一次跳两阶
//number=n:分两种情况。第一次跳一阶,还有f(n-1)种;第一次跳两阶,还有f(n-2)种。
if(number<=2)
return number==1?1:2;
int op1=1;
int op2=2;
int res=0;
for(int i=3;i<=number;++i)
{
res=op1+op2;
op1=op2;
op2=res;
}
return res;
}
};
3、变态青蛙跳:一次1节或2节或…或n节;
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
class Solution {
public:
int jumpFloorII(int number) {
//number=1;f(1)=1
//number=2;f(2)=2
//number=3;f(3)=f(1)+f(2)+1
//number=n;f(n)=f(1)+f(2)+....+f(n-1)+1
//f(n)=2^(n-1)
int res=1;
for(int i=1;i<number;++i)
{
res*=2;
}
return res;
}
};
4、矩形覆盖:
可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
class Solution {
public:
int rectCover(int number) {
//仍旧是fibonacci问题
if(number<=2)
return (number<=1)?(number==1?1:0):2;
int op1=1;
int op2=2;
int res=0;
for(int i=3;i<=number;++i)
{
res=op1+op2;
op1=op2;
op2=res;
}
return res;
}
};