剑指offer 10-1 斐波那契数列
题目描述:
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
n<=39
解题思路:
斐波那契数列公式:
f(n) = n (n<=1 , 即n=0,1)
f(n) = f(n-1)+f(n-2) (n>1)
自底向上计算
代码:
class Solution {
public:
int Fibonacci(int n) {
if(n==0 || n==1)
return n;
int fibi;
int fibi_1 =1;
int fibi_2 = 0;
for(int i=2;i<=n;++i){
fibi = fibi_1+fibi_2;
fibi_2 = fibi_1;
fibi_1 = fibi;
}
return fibi;
}
};
剑指offer 10-2 跳台阶
题目描述:
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
解题思路:
假设总共有f(n)种跳法
1)第一次只跳1级,剩下的f(n-1)
2)第一次跳2级,剩下的f(n-2)
所以f(n)=f(n-1)+f(n-2),同样是个斐波那契数列
代码:
class Solution {
public:
int jumpFloor(int number) {
if(number ==1 || number == 2)
return number;
int pre = 2;
int ppre = 1;
int cur;
for(int i=3;i<=number;++i){
cur = pre+ppre;
ppre = pre;
pre = cur;
}
return cur;
}
};
剑指offer 10-3 变态跳台阶
题目描述:
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
解题思路:
1) 第一次可以跳1个,也可以跳2个,3个.....n个。
所以 f(n)=f(n-1)+f(n-2)+。。。+f(0)
而f(n-1)=f(n-2)+。。。。f(0)
所以f(n)=2*f(n-1) 又因为f(1)=1=2^0,所以f(n)=2^(n-1)
2)每个台阶可以看作一块木板,让青蛙跳上去,n个台阶就有n块木板,最后一块木板是青蛙到达的位子, 必须存在,其他 (n-1) 块木板可以任意选择是否存在,则每个木板有存在和不存在两种选择,(n-1) 块木板 就有 [2^(n-1)] 种跳法,可以直接得到结果。
代码:
class Solution {
public:
int jumpFloorII(int number) {
return 1<<(number-1);
}
};
剑指offer 10-4 矩形覆盖
题目描述:
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
解题思路:
依旧斐波那契数列
代码:
class Solution {
public:
int rectCover(int number) {
if(number ==1 || number ==2)
return number;
int ppre = 1;
int pre = 2;
int cur;
for(int i= 3;i<=number;++i){
cur = ppre+pre;
ppre = pre;
pre = cur;
}
return cur;
}
};