题目:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。
n<=39
int Fibonacci(int n) {
// 递归
if(n < 0) return 0;
else if(n == 1 || n == 2) return 1;
else if(n >2 && n <= 39) {
return Fibonacci(n-1) + Fibonacci(n-2);
}
else
return 0;
}
//您的代码已保存
运行超时:您的程序未能在规定时间内运行结束,请检查是否循环有错或算法复杂度过大。case通过率为0.00%
int Fibonacci(int n) {
if(n<=0) return 0;
if(n==1 || n==2) return 1;
int f1 = 1;
int f2 =1;
int f3;
for(int i =3; i<=n;i++) {
f3 = f1+f2;
f1 = f2;
f2 = f3;
}
return f3;
}
总结:递归重复的代码太多,时间复杂度是O(nlogn),而下面第二种的解法是O(n)。
题目二:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
分析:如果只有1级台阶,那显然只有一种跳法。如果有2级台阶,那就有两种跳法了:一种是分两次跳,每次跳1级;另外是一次跳2级。接着我们再来讨论一般情况。我们把n级台阶时的跳法看成是n的函数,记为f(n)。当n>2时,第一次跳的时候就有两种不同的选择:
一是第一次只跳1级,此时跳法数目等于后面剩下的n-1级台阶的跳法数目,即为f(n-1);
另一种选择是第一次跳2级,此时跳法数目等于后面剩下的n-2级台阶的跳法数目,即为f(n-2);
因此n级台阶的不同跳法的总数f(n)=f(n-1)+f(n-2);
int jumpFloor(int number) {
if(number <= 0) return 0;
else if(number == 1) return 1;
else if(number == 2) return 2;
else {
return jumpFloor(number-1) + jumpFloor(number-2);
}
}
题目三:变态跳台阶:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
n = 1时,只有1种跳法,f(1) = 1
n = 2时,会有两个跳得方式,一次1阶或者2阶,这回归到了问题(1) ,f(2) = f(2-1) + f(2-2)
n = 3时,会有三种跳得方式,1阶、2阶、3阶, 那么就是第一次跳出1阶后面剩下:f(3-1);第一次跳出2阶,剩下f(3-2);第一次3阶,那么剩下f(3-3) ,因此结论是f(3) = f(3-1)+f(3-2)+f(3-3)
n = n时,会有n中跳的方式,1阶、2阶…n阶,当n时,第一次跳的时候就有多种不同的选择:
第一次只跳1级,此时跳法数目等于后面剩下的n-1级台阶的跳法数目,即为f(n-1);
第一次跳2级,此时跳法数目等于后面剩下的n-2级台阶的跳法数目,即为f(n-2);
第一次跳3级,此时跳法数目等于后面剩下的n-2级台阶的跳法数目,即为f(n-3);
……
第一次跳n-1级,此时跳法数目等于后面剩下的n-2级台阶的跳法数目,即为f(1);
第一次跳n级,此时跳法数目等于后面剩下的n-2级台阶的跳法数目,即为f(0);
f(n) = f(n-1)+f(n-2)+…+f(n-(n-1)) + f(n-n) => f(0) + f(1) + f(2) + f(3) + … + f(n-1)
6) 由以上已经是一种结论,但是为了简单,我们可以继续简化:
f(n-1) = f(0) + f(1)+f(2)+f(3) + … + f((n-1)-1) = f(0) + f(1) + f(2) + f(3) + … + f(n-2)
f(n) = f(0) + f(1) + f(2) + f(3) + … + f(n-2) + f(n-1) = f(n-1) + f(n-1)
可以得出: f(n) = 2*f(n-1)
int jumpFloorII(int number) {
if(number <=0) return 0;
else if(number == 1) {
return 1;
}else {
return 2 * jumpFloorII(number - 1);
}
}