剑指Offer #10 矩形覆盖(问题分析)
題目來源:牛客網(wǎng)-劍指Offer專題
題目地址:矩形覆蓋
題目描述
我們可以用2?12*12?1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2?12*12?1的小矩形無重疊地覆蓋一個2?n2*n2?n的大矩形,總共有多少種方法?
比如n=3時,2?32*32?3的矩形塊有3種覆蓋方法:
題目解析
其實這類題目,如果實在不知道怎么下手,都不妨先考慮枚舉,將前面小的數(shù)先枚舉出來,然后再猜測規(guī)律是什么。一般可以考慮的式子有 2n?12^{n-1}2n?1 、斐波那契數(shù)列、n相關(guān)的多項式、組合數(shù)、卡特蘭數(shù)、歐拉函數(shù)……
這看這道題,我們先把 nnn 比較小的情況先枚舉出來,如下表所示:
| result | 1 | 2 | 3 | 5 | 8 | 13 | … |
看,不騙你們吧!這不是斐波那契數(shù)列嗎?我不是坑你們,只是在實在無從下手的時候給你們提供一種思路,別動不動就寫什么搜索去枚舉這些情況……
下面是正解時間:
參考了討論區(qū)中Follow大佬的講解思路,假設(shè)我們有一個 2?n2*n2?n 的大矩形,當(dāng) n=in=in=i時的方法有 f(i)f(i)f(i) 種,我們先考慮第一個 2?12*12?1 小矩形的擺法。有下面兩種情況:
- 情況一:如下圖豎著擺放,那么剩下的矩形就形成了一個 2?(n?1)2*(n-1)2?(n?1) 的大矩形,所以這種情況下的覆蓋方法有 f(n?1)f(n-1)f(n?1) 種。
| * |
- 情況二:如下圖橫著擺放,為了把它下方的空間覆蓋,第二個 2?12*12?1 小矩形也必須橫著擺在它的下方,,那么剩下的矩形就形成了一個 2?(n?2)2*(n-2)2?(n?2) 的大矩形,所以這種情況下的覆蓋方法有 f(n?2)f(n-2)f(n?2) 種。
| - | - |
于是,我們就可以知道 f(n)=f(n?1)+f(n?2)f(n)=f(n-1) + f(n-2)f(n)=f(n?1)+f(n?2),再結(jié)合 n?2≤0n-2 \leq0n?2≤0 的情況,我們就可以得到以下的遞推式啦~
f(n)={1,n=12,n=2f(n?1)+f(n?2),n>2f(n)= \begin{cases} 1&, \text{n=1} \\ 2 &,\text{n=2} \\ f(n-1) + f(n-2) &,\text{n>2} \end{cases} f(n)=??????12f(n?1)+f(n?2)?,n=1,n=2,n>2?
這個遞推式看爛了,這里就簡單寫常用的兩種實現(xiàn)方式,詳情可以參考上篇博客解法:斐波那契數(shù)列(四種解法)。
方法一:
面試別寫型遞推版實現(xiàn),時間復(fù)雜度 O(2n)O(2^n)O(2n)。
方法二:
面試推薦型,自底向上型循環(huán)求解,時間復(fù)雜度為 O(n)O(n)O(n)。
如果本文對你有所幫助,要記得點贊哦~
總結(jié)
以上是生活随笔為你收集整理的剑指Offer #10 矩形覆盖(问题分析)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CentOS7安装wdCP面板,快速搭建
- 下一篇: 「软件测试基础」理论篇之软件测试概论