日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

剑指Offer #10 矩形覆盖(问题分析)

發布時間:2025/3/20 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 剑指Offer #10 矩形覆盖(问题分析) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目來源:牛客網-劍指Offer專題
題目地址:矩形覆蓋

題目描述

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

比如n=3時,2?32*32?3的矩形塊有3種覆蓋方法:

題目解析

其實這類題目,如果實在不知道怎么下手,都不妨先考慮枚舉,將前面小的數先枚舉出來,然后再猜測規律是什么。一般可以考慮的式子有 2n?12^{n-1}2n?1 、斐波那契數列、n相關的多項式、組合數、卡特蘭數、歐拉函數……

這看這道題,我們先把 nnn 比較小的情況先枚舉出來,如下表所示:

n123456…
result1235813

看,不騙你們吧!這不是斐波那契數列嗎?我不是坑你們,只是在實在無從下手的時候給你們提供一種思路,別動不動就寫什么搜索去枚舉這些情況……


下面是正解時間:

參考了討論區中Follow大佬的講解思路,假設我們有一個 2?n2*n2?n 的大矩形,當 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),再結合 n?2≤0n-2 \leq0n?20 的情況,我們就可以得到以下的遞推式啦~

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?

這個遞推式看爛了,這里就簡單寫常用的兩種實現方式,詳情可以參考上篇博客解法:斐波那契數列(四種解法)。

方法一:
面試別寫型遞推版實現,時間復雜度 O(2n)O(2^n)O(2n)

public class Solution {public int RectCover(int n) {if (n < 3) {return n;}return RectCover(n - 1) + RectCover(n - 2);} }

方法二:
面試推薦型,自底向上型循環求解,時間復雜度為 O(n)O(n)O(n)

public class Solution {public int RectCover(int n) {if (n == 0) return 0;int a = 1, b = 1;for (int i = 1; i < n; i++) {a = a + b;b = a - b;}return a;} }

如果本文對你有所幫助,要記得點贊哦~

總結

以上是生活随笔為你收集整理的剑指Offer #10 矩形覆盖(问题分析)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。