剑指Offer刷题笔记(Java)10——矩形覆盖

题目描述

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

解题思路

针对这种题目,还是一个从特殊到一般的过程。首先若n=1,则只有一种方法覆盖;若n=2,则可以有横着放两个小矩形和竖着放两个小矩形两种方法,分析这两种方法,如何覆盖取决于第一个小矩形如何放,为了更详细地说明,考虑若n=3时,如果第一个小矩形竖着放,则后面的22矩形有两种覆盖方法,如果第一个小矩形横着放,则第二个小矩形也必须横着放。总的来说,就是第一次覆盖21的面积还是2*2的面积,用公式来表示则还是f(n)=f(n-1)+f(n-2),这道题也是斐波那契数列的变形,因此还是用递归和循环两种方式实现。

递归代码如下:

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

循环的代码如下:

public class Solution {
    public int RectCover(int target) {
        int count = 0;
        int count_1 = 2;
        int count_2 = 1;
        if(target == 1){
            count = count_2;
        }else if(target == 2){
            count = count_1;
        }else{
            for(int i=3;i<=target;i++){
                count = count_1+count_2;
                count_2 = count_1;
                count_1 = count;
            }
        }
        return count;
    }
}

总结

做本题时感觉分析起来很轻松,很快就有思路,所以要多做题培养一个思维模式,就跟以前做数学题一样,思路对了之后就好做了。

你可能感兴趣的:(刷题)