【劍指offer】面試題 10-擴展:矩形覆蓋

題目描述

我們可以用2*1的小矩形橫着或者豎着去覆蓋更大的矩形。請問用n個2*1的小矩形無重疊地覆蓋一個2*n的大矩形,總共有多少種方法?

 

時間限制:1秒 空間限制:32768K 熱度指數:318412

本題知識點: 遞歸

 

思路

依舊是斐波那契數列的變形。

2*N的大矩形,和N個2*1的小矩形。

接下來,我們需要考慮的是遞歸的幾種情形:

1、target  <= 0 ,return 0;

(很多人認爲這裏應該是return 1,但是我不認同,因爲target  < =0 ,對於計算機來說,應該是一種異常情況)

2、target = 1,大矩形爲2*1,小矩形只有 1 種擺法,return 1;

3、target = 2, 大矩形爲2*2,小矩形有2中擺法,return 2;

4、target = N,此時分爲兩步走:

      1)第一次豎着擺一個小矩形,那麼擺放的方法總共有 F(target - 1)種擺法;

                                     

       2)第一次橫着擺一個小矩形,那麼擺放的方法總共有 F(target - 2)種擺法;

            解釋一下:爲啥是F(target - 2),因爲只要第一塊小矩形是橫着擺放,那麼下面的位置也就確定了。

                      ======》》》   

參考代碼

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章