思路

7,8,9,10的思路都是一样的
F(n)=F(n-1)+F(n-2)

  • 递归:占内存,容易栈溢出
  • 动态规划,一维数组保存前面所有状态,又由于本题只与前两个状态有关,所以用两个变量保存前两个状态即可

第7题

动态规划

public class Solution {
    public int Fibonacci(int n) {
        if(n<=0){
            return 0;
        }
        if(n==1||n==2){
            return 1;
        }
        int p=1,q=1;
        for(int i=3;i<=n;i++){
            q=p+q;
            int temp=p;
            p=q;
            q=temp;
        }
        return p;
    }
}

递归,本题n较小,也OK

public class Solution {
    public int Fibonacci(int n) {
        if(n==2){
            return 1;
        }
        if(n==1||n==0){
            return 0;
        }
        if(n<=0){
            return 0
        }
        return Fibonacci(n-1)+Fibonacci(n-2);
    }
}

第8题 青蛙跳台阶,跳1,2步台阶

public class Solution {
    public int JumpFloor(int target) {
        if(target<=1){
            return 1;
        }
        int[] ints=new int[target+1];
        ints[0]=1;
        ints[1]=1;
        for(int i=2;i<ints.length;i++){
            ints[i]=ints[i-1]+ints[i-2];
        }
        return ints[target];
    }
}

第9题 变态跳台阶,可以跳1,2,3...n步台阶

F(n)=F(n-1)+...+F(0),F(0)=1,F(1)=1
进一步归纳,可以发现,F(n)=2*F(n-1),n>=2;

public class Solution {
    public int JumpFloorII(int target) {
        if(target<0){
            return 0;
        }
        if(target==0||target==1){
            return 1;
        }
        int sum=1;
        for(int i=2;i<=target;i++){
            sum=sum*2;
        }

        return sum;
    }
}

第10题 矩形覆盖

public class Solution {
    public int RectCover(int target) {
        if(target<=2){
            return target;
        }
        int[] res=new int[target+1];
        res[0]=0;
        res[1]=1;
        res[2]=2;
        for(int i=3;i<res.length;i++){
            res[i]=res[i-1]+res[i-2];
        }
        return res[target];
    }
}