面试题10:斐波那契数列+跳台阶

题目:斐波那契数列

思路:为了避免重复计算,将中间数保留起来。
当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;
    }

猜你喜欢

转载自blog.csdn.net/htt789/article/details/80966593