题目:
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
n<=39
ps:
题目:跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
答案:这其实就是另一种形式的斐波那契数列,解法一样。(考虑最后一次是跳1级还是2级)
题目:矩形覆盖
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?比如n=3时,2*3的矩形块有3种覆盖方法:
答案:本质也是斐波那契数列。(考虑第一个矩形是横着放还是竖着放)
答案:
解法一:
直接使用f(n)=f(n-1)+f(n-2)的公式,(但这种解法有好多重复计算,效率不高),代码如下:
public class Solution {
public int Fibonacci(int n) {
if(n==0){
return 0;
}
if(n==1){
return 1;
}
return Fibonacci(n-1)+Fibonacci(n-2);
}
}
时间复杂度:O(2^n)
空间复杂度:O(1)
解法二:
用一个数组存下计算结果,避免重复计算,代码如下:
public class Solution {
public int Fibonacci(int n) {
int[] array = new int[40];
array[0]=0;
array[1]=1;
for(int i=2;i<=n;i++){
array[i] = array[i-1]+array[i-2];
}
return array[n];
}
}
时间复杂度:O(n)
空间复杂度:O(n)
解法三:
上面的空间复杂度还可以优化,只存前两个数,代码如下:
public class Solution {
public int Fibonacci(int n) {
if(n<2){
return n;
}
int prepre = 0;
int pre = 1;
int result = 0;
for(int i=2;i<=n;i++){
result = pre + prepre;
prepre = pre;
pre = result;
}
return result;
}
}
时间复杂度:O(n)
空间复杂度:O(1)