日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

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

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

題目來源:??途W(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 比較小的情況先枚舉出來,如下表所示:

n123456…
result1235813

看,不騙你們吧!這不是斐波那契數(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?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?

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

方法一:
面試別寫型遞推版實現(xiàn),時間復(fù)雜度 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);} }

方法二:
面試推薦型,自底向上型循環(huán)求解,時間復(fù)雜度為 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;} }

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

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。