1. 程式人生 > >劍指offer-10-矩形覆蓋

劍指offer-10-矩形覆蓋

rect 方法 pro 拓展 返回 分析 -- 存在 應該

題目描述

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

題目分析

(參考牛客網Daniel Lee 分享的)用歸納法歸納如下,

(1)當 n < 1時,顯然不需要用2*1塊覆蓋,按照題目提示應該返回 0。

(2)當 n = 1時,只存在一種情況。

技術分享圖片

(3)當 n = 2時,存在兩種情況。

技術分享圖片

(4)當 n = 3時,明顯感覺到如果沒有章法,思維難度比之前提升挺多的。

技術分享圖片

... 嘗試歸納,本質上 n 覆蓋方法種類都是對 n - 1 時的擴展。

可以明確,n 時必定有 n-1時原來方式與2*1的方塊結合。也就是說, f(n) = f(n-1) + ?(暫時無法判斷)。

(4)如果我們現在歸納 n = 4,應該是什麽形式?

4.1)保持原來n = 3時內容,並擴展一個 2*1 方塊,形式分別為 “| | | |”、“= | |”、“| = |”

4.2)新增加的21 方塊與臨近的21方塊組成 2*2結構,然後可以變形成 “=”。於是 n = 4在原來n = 3基礎上增加了"| | ="、“= =”。

再自己看看這多出來的兩種形式,是不是只比n = 2多了“=”。其實這就是關鍵點所在...因為,只要21或12有相同的兩個時,就會組成2*2形式,於是就又可以變形了。

所以,自然而然可以得出規律: f(n) = f(n-1) + f(n-2), (n > 2)。

拓展

如果看了這一套理論還存在疑惑。可以嘗試將題目改成13方塊覆蓋3n、14方塊覆蓋4n。

相應的結論應該是:

(1)1 * 3方塊 覆 蓋3*n區域:f(n) = f(n-1) + f(n - 3), (n > 3)

(2) 1 4 方塊 覆 蓋4n區域:f(n) = f(n-1) + f(n - 4),(n > 4)

更一般的結論,如果用1m的方塊覆蓋mn區域,遞推關系式為f(n) = f(n-1) + f(n-m),(n > m)。

代碼

function rectCover(number)
{
    // write code here
    if(number==0)return 0;
    var f=1,g=2;
    while(--number){
        g=f+g;
        f=g-f;
    }
    return f;
}

劍指offer-10-矩形覆蓋