剑指offer10_矩形覆盖

题目描述

我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?

        //这个问题最后也可以转化为斐波那契数列来思考:
        //当大矩形的长度为n时,前两格的覆盖方式有两种,
        //第一种是在第一格上竖着放一个小矩形,这样后面的空格的方法就和大矩形长度为n-1时一样;
        //第二种是在前两格横着放置两格小矩形,这样后面的空格的放置方法就和大矩形长度为n-2时的一样

        //这样递推关系式子为F(n)=F(n-1)+F(n-2)

自己根据递推公式写的代码有两种:

一个是for循环的,运行时间短一些

public class Solution {
    public int RectCover(int target) {
        //特殊情况预处理
        if(target<=0) return 0; 
        if(target==1) return 1;
        if(target==2) return 2;
        int[] res=new int[target+1];
        res[0]=0;
        res[1]=1;
        res[2]=2;
        for(int i=3; i<=target;i++){ 
            res[i]=res[i-1]+res[i-2];
        } 
        return res[target]; 
    }
}

一个是递归的,运行时间长一些,但简洁

public class Solution {
    public int RectCover(int target) {
        if(target<=0) return 0; 
        if(target==1) return 1;
        if(target==2) return 2;
        return RectCover(target-1)+RectCover(target-2);
    }
}

猜你喜欢

转载自blog.csdn.net/lilililililydia/article/details/87880628
今日推荐