题目:斐波那契数列
思路:为了避免重复计算,将中间数保留起来。
当n>1时,上一次加法的参数和结果用于本次。
时间复杂度O(n)
注:数据类型为long long
int Fibonacci(int n) {
long long result;
if(n==0||n==1)
result=n;
long long one=0;
long long two=1;
for(int i=2;i<=n;i++){
result=two+one;
one=two;
two=result;
}
return result;
}
题目描述:
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
解题思路:
只有一节台阶,只有一种跳法。
有两节台阶,每次跳一节台阶;一次跳两节台阶,两种跳法。
有n节台阶,第一次跳一级台阶,剩下n-1节台阶f(n-1);第一次跳2级台阶,剩下n-2节台阶f(n-2),总共次数f(n-1)+f(n-2)。
当n<=2时,f(n)=n
当n>2时,f(n)=f(n-1)+f(n-2) //从i=3开始循环
int jumpFloor(int number) {
long long result;
if(number==0||number==1||number==2)
result=number;
long long one=1;
long long two=2;
for(int i=3;i<number+1;i++){
result=two+one;
one=two;
two=result;
}
return result;
}
题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
解题思路:
只有一个台阶,f(1)=1,只有一种跳法
两个台阶,第一次跳一个台阶,剩下一节台阶f(1)种跳法;一次跳两个台阶。f(2)=f(1)+1
有n节台阶,第一次跳一个台阶,剩下n-1节台阶有f(n-1)种跳法;第一次跳两个台阶,剩下n-2节台阶有f(n-2)种跳法;第一次跳3级台阶剩下n-3级台阶有f(n-3)种跳法;依次类推,f(n)=f(n-1)+f(n-2)+f(n-3)+…+f(1)+1,其中f(n-2)+f(n-3)+…+f(1)+1=f(n-1)。因此f(n)=2*f(n-1)
int jumpFloorII(int number) {
if(number<=1)
return number;
long long result=0;
if(number>1){
result+=2*jumpFloorII(number-1);
}
return result;
}
矩阵覆盖:
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
解题思路:P79
int rectCover(int number) {
if(number<=2)
return number;
long long result=0;
long long one=1;
long long two=2;
for(int i=3;i<=number;i++){
result=two+one;
one=two;
two=result;
}
return result;
}