剑指offer:斐波那契数列(递归,跳台阶/矩形覆盖)

题目:

大家都知道斐波那契数列,现在要求输入一个整数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) 

发布了75 篇原创文章 · 获赞 2 · 访问量 7995

猜你喜欢

转载自blog.csdn.net/wyplj2015/article/details/104837887