一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一道比較有難度的完美矩形題

算法與數(shù)據(jù)結(jié)構(gòu) ? 來(lái)源:算法與數(shù)據(jù)結(jié)構(gòu) ? 作者:labuladong ? 2021-01-04 14:17 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

今天講一道非常有意思,而且比較有難度的題目。

我們知道一個(gè)矩形有四個(gè)頂點(diǎn),但是只要兩個(gè)頂點(diǎn)的坐標(biāo)就可以確定一個(gè)矩形了(比如左下角和右上角兩個(gè)頂點(diǎn)坐標(biāo))。

來(lái)看看力扣第 391 題「完美矩形」,題目會(huì)給我們輸入一個(gè)數(shù)組rectangles,里面裝著若干四元組(x1,y1,x2,y2),每個(gè)四元組就是記錄一個(gè)矩形的左下角和右上角頂點(diǎn)坐標(biāo)。

也就是說(shuō),輸入的rectangles數(shù)組實(shí)際上就是很多小矩形,題目要求我們輸出一個(gè)布爾值,判斷這些小矩形能否構(gòu)成一個(gè)「完美矩形」。函數(shù)簽名如下:

defisRectangleCover(rectangles:List[List[int]])->bool

所謂「完美矩形」,就是說(shuō)rectangles中的小矩形拼成圖形必須是一個(gè)大矩形,且大矩形中不能有重疊和空缺。

比如說(shuō)題目給我們舉了幾個(gè)例子:

19b50fdc-4423-11eb-8b86-12bb97331649.png

1a1cb240-4423-11eb-8b86-12bb97331649.png

1a4475c8-4423-11eb-8b86-12bb97331649.png

這個(gè)題目難度是 Hard,如果沒(méi)有做過(guò)類似的題目,還真做不出來(lái)。

常規(guī)的思路,起碼要把最終形成的圖形表示出來(lái)吧,而且你要有方法去判斷兩個(gè)矩形是否有重疊,是否有空隙,雖然可以做到,不過(guò)感覺(jué)異常復(fù)雜。

其實(shí),想判斷最終形成的圖形是否是完美矩形,需要從「面積」和「頂點(diǎn)」兩個(gè)角度來(lái)處理。

先說(shuō)說(shuō)什么叫從「面積」的角度。

rectangles數(shù)組中每個(gè)元素都是一個(gè)四元組(x1, y1, x2, y2),表示一個(gè)小矩形的左下角頂點(diǎn)坐標(biāo)和右上角頂點(diǎn)坐標(biāo)。

那么假設(shè)這些小矩形最終形成了一個(gè)「完美矩形」,你會(huì)不會(huì)求這個(gè)完美矩形的左下角頂點(diǎn)坐標(biāo)(X1, Y1)和右上角頂點(diǎn)的坐標(biāo)(X2, Y2)?

這個(gè)很簡(jiǎn)單吧,左下角頂點(diǎn)(X1, Y1)就是rectangles中所有小矩形中最靠左下角的那個(gè)小矩形的左下角頂點(diǎn);右上角頂點(diǎn)(X2, Y2)就是所有小矩形中最靠右上角的那個(gè)小矩形的右上角頂點(diǎn)。

注意我們用小寫(xiě)字母表示小矩形的坐標(biāo),大寫(xiě)字母表示最終形成的完美矩形的坐標(biāo),可以這樣寫(xiě)代碼:

#左下角頂點(diǎn),初始化為正無(wú)窮,以便記錄最小值
X1,Y1=float('inf'),float('inf')
#右上角頂點(diǎn),初始化為負(fù)無(wú)窮,以便記錄最大值
X2,Y2=-float('inf'),-float('inf')

forx1,y1,x2,y2inrectangles:
#取小矩形左下角頂點(diǎn)的最小值
X1,Y1=min(X1,x1),min(Y1,y1)
#取小矩形右上角頂點(diǎn)的最大值
X2,Y2=max(X2,x2),max(Y2,y2)

這樣就能求出完美矩形的左下角頂點(diǎn)坐標(biāo)(X1, Y1)和右上角頂點(diǎn)的坐標(biāo)(X2, Y2)了。

計(jì)算出的X1,Y1,X2,Y2坐標(biāo)是完美矩形的「理論坐標(biāo)」,如果所有小矩形的面積之和不等于這個(gè)完美矩形的理論面積,那么說(shuō)明最終形成的圖形肯定存在空缺或者重疊,肯定不是完美矩形。

代碼可以進(jìn)一步:

defisRectangleCover(rectangles:List[List[int]])->bool:
X1,Y1=float('inf'),float('inf')
X2,Y2=-float('inf'),-float('inf')
#記錄所有小矩形的面積之和
actual_area=0
forx1,y1,x2,y2inrectangles:
#計(jì)算完美矩形的理論坐標(biāo)
X1,Y1=min(X1,x1),min(Y1,y1)
X2,Y2=max(X2,x2),max(Y2,y2)
#累加所有小矩形的面積
actual_area+=(x2-x1)*(y2-y1)

#計(jì)算完美矩形的理論面積
expected_area=(X2-X1)*(Y2-Y1)
#面積應(yīng)該相同
ifactual_area!=expected_area:
returnFalse

returnTrue

這樣,「面積」這個(gè)維度就完成了,思路其實(shí)不難,無(wú)非就是假設(shè)最終形成的圖形是個(gè)完美矩形,然后比較面積是否相等,如果不相等的話說(shuō)明最終形成的圖形一定存在空缺或者重疊部分,不是完美矩形。

但是反過(guò)來(lái)說(shuō),如果面積相同,是否可以證明最終形成的圖形是完美矩形,一定不存在空缺或者重疊?

肯定是不行的,舉個(gè)很簡(jiǎn)單的例子,你假想一個(gè)完美矩形,然后我在它中間挖掉一個(gè)小矩形,把這個(gè)小矩形向下平移一個(gè)單位。這樣小矩形的面積之和沒(méi)變,但是原來(lái)的完美矩形中就空缺了一部分,也重疊了一部分,已經(jīng)不是完美矩形了。

綜上,即便面積相同,并不能完全保證不存在空缺或者重疊,所以我們需要從「頂點(diǎn)」的維度來(lái)輔助判斷。

記得小學(xué)的時(shí)候有一道智力題,給你一個(gè)矩形,切一刀,剩下的圖形有幾個(gè)頂點(diǎn)?答案是,如果沿著對(duì)角線切,就剩 3 個(gè)頂點(diǎn);如果橫著或者豎著切,剩 4 個(gè)頂點(diǎn);如果只切掉一個(gè)小角,那么會(huì)出現(xiàn) 5 個(gè)頂點(diǎn)。

回到這道題,我們接下來(lái)的分析也有那么一點(diǎn)智力題的味道。

顯然,完美矩形一定只有四個(gè)頂點(diǎn)。矩形嘛,按理說(shuō)應(yīng)該有四個(gè)頂點(diǎn),如果存在空缺或者重疊的話,肯定不是四個(gè)頂點(diǎn),比如說(shuō)題目的這兩個(gè)例子就有不止 4 個(gè)頂點(diǎn):

1a955cfe-4423-11eb-8b86-12bb97331649.png

PS:我也不知道應(yīng)該用「頂點(diǎn)」還是「角」來(lái)形容,好像都不太準(zhǔn)確,本文統(tǒng)一用「頂點(diǎn)」來(lái)形容,大家理解就好~

只要我們想辦法計(jì)算rectangles中的小矩形最終形成的圖形有幾個(gè)頂點(diǎn),就能判斷最終的圖形是不是一個(gè)完美矩形了。

那么頂點(diǎn)是如何形成的呢?我們倒是一眼就可以看出來(lái)頂點(diǎn)在哪里,問(wèn)題是如何讓計(jì)算機(jī),讓算法知道某一個(gè)點(diǎn)是不是頂點(diǎn)呢?這也是本題的難點(diǎn)所在。

看下圖的四種情況:

1ae13f5c-4423-11eb-8b86-12bb97331649.jpg

圖中畫(huà)紅點(diǎn)的地方,什么時(shí)候是頂點(diǎn),什么時(shí)候不是頂點(diǎn)?顯然,情況一和情況三的時(shí)候是頂點(diǎn),而情況二和情況四的時(shí)候不是頂點(diǎn)。

也就是說(shuō),當(dāng)某一個(gè)點(diǎn)同時(shí)是 2 個(gè)或者 4 個(gè)小矩形的頂點(diǎn)時(shí),該點(diǎn)最終不是頂點(diǎn);當(dāng)某一個(gè)點(diǎn)同時(shí)是 1 個(gè)或者 3 個(gè)小矩形的頂點(diǎn)時(shí),該點(diǎn)最終是一個(gè)頂點(diǎn)。

注意,2 和 4 都是偶數(shù),1 和 3 都是奇數(shù),我們想計(jì)算最終形成的圖形中有幾個(gè)頂點(diǎn),也就是要篩選出那些出現(xiàn)了奇數(shù)次的頂點(diǎn),可以這樣寫(xiě)代碼:

defisRectangleCover(rectangles:List[List[int]])->bool:
X1,Y1=float('inf'),float('inf')
X2,Y2=-float('inf'),-float('inf')

actual_area=0
#哈希集合,記錄最終圖形的頂點(diǎn)
points=set()
forx1,y1,x2,y2inrectangles:
X1,Y1=min(X1,x1),min(Y1,y1)
X2,Y2=max(X2,x2),max(Y2,y2)

actual_area+=(x2-x1)*(y2-y1)
#先算出小矩形每個(gè)點(diǎn)的坐標(biāo)
p1,p2=(x1,y1),(x1,y2)
p3,p4=(x2,y1),(x2,y2)
#對(duì)于每個(gè)點(diǎn),如果存在集合中,刪除它;
#如果不存在集合中,添加它;
#在集合中剩下的點(diǎn)都是出現(xiàn)奇數(shù)次的點(diǎn)
forpin[p1,p2,p3,p4]:
ifpinpoints:points.remove(p)
else:points.add(p)

expected_area=(X2-X1)*(Y2-Y1)
ifactual_area!=expected_area:
returnFalse

returnTrue

這段代碼中,我們用一個(gè)points集合記錄rectangles中小矩形組成的最終圖形的頂點(diǎn)坐標(biāo),關(guān)鍵邏輯在于如何向points中添加坐標(biāo):

如果某一個(gè)頂點(diǎn)p存在于集合points中,則將它刪除;如果不存在于集合points中,則將它插入。

這個(gè)簡(jiǎn)單的邏輯,讓points集合最終只會(huì)留下那些出現(xiàn)了 1 次或者 3 次的頂點(diǎn),那些出現(xiàn)了 2 次或者 4 次的頂點(diǎn)都被消掉了。

那么首先想到,points集合中最后應(yīng)該只有 4 個(gè)頂點(diǎn)對(duì)吧,如果len(points) != 4說(shuō)明最終構(gòu)成的圖形肯定不是完美矩形。

但是如果len(points) == 4是否能說(shuō)明最終構(gòu)成的圖形肯定是完美矩形呢?也不行,因?yàn)轭}目并沒(méi)有說(shuō)rectangles中的小矩形不存在重復(fù),比如下面這種情況:

1b0dfa42-4423-11eb-8b86-12bb97331649.jpg

下面兩個(gè)矩形重復(fù)了,按照我們的算法邏輯,它們的頂點(diǎn)都被消掉了,最終是剩下了四個(gè)頂點(diǎn);再看面積,完美矩形的理論坐標(biāo)是圖中紅色的點(diǎn),計(jì)算出的理論面積和實(shí)際面積也相同。但是顯然這種情況不是題目要求完美矩形。

所以不僅要保證len(points) == 4,而且要保證points中最終剩下的點(diǎn)坐標(biāo)就是完美矩形的四個(gè)理論坐標(biāo),直接看代碼吧:

defisRectangleCover(rectangles:List[List[int]])->bool:
X1,Y1=float('inf'),float('inf')
X2,Y2=-float('inf'),-float('inf')

points=set()
actual_area=0
forx1,y1,x2,y2inrectangles:
#計(jì)算完美矩形的理論頂點(diǎn)坐標(biāo)
X1,Y1=min(X1,x1),min(Y1,y1)
X2,Y2=max(X2,x2),max(Y2,y2)
#累加小矩形的面積
actual_area+=(x2-x1)*(y2-y1)
#記錄最終形成的圖形中的頂點(diǎn)
p1,p2=(x1,y1),(x1,y2)
p3,p4=(x2,y1),(x2,y2)
forpin[p1,p2,p3,p4]:
ifpinpoints:points.remove(p)
else:points.add(p)
#判斷面積是否相同
expected_area=(X2-X1)*(Y2-Y1)
ifactual_area!=expected_area:
returnFalse
#判斷最終留下的頂點(diǎn)個(gè)數(shù)是否為4
iflen(points)!=4:returnFalse
#判斷留下的4個(gè)頂點(diǎn)是否是完美矩形的頂點(diǎn)
if(X1,Y1)notinpoints:returnFalse
if(X1,Y2)notinpoints:returnFalse
if(X2,Y1)notinpoints:returnFalse
if(X2,Y2)notinpoints:returnFalse
#面積和頂點(diǎn)都對(duì)應(yīng),說(shuō)明矩形符合題意
returnTrue

這就是最終的解法代碼,從「面積」和「頂點(diǎn)」兩個(gè)維度來(lái)判斷:

1、判斷面積,通過(guò)完美矩形的理論坐標(biāo)計(jì)算出一個(gè)理論面積,然后和rectangles中小矩形的實(shí)際面積和做對(duì)比。

2、判斷頂點(diǎn),points集合中應(yīng)該只剩下 4 個(gè)頂點(diǎn)且剩下的頂點(diǎn)必須都是完美矩形的理論頂點(diǎn)。

說(shuō)實(shí)話,如果沒(méi)做過(guò),這種特性真不是一時(shí)半會(huì)能想到的,但是看過(guò)一遍沒(méi)問(wèn)題了,你學(xué)會(huì)了嗎?

責(zé)任編輯:xj

原文標(biāo)題:這道「完美矩形」給我整不會(huì)了…

文章出處:【微信公眾號(hào):算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4381

    瀏覽量

    64860
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4900

    瀏覽量

    70731

原文標(biāo)題:這道「完美矩形」給我整不會(huì)了…

文章出處:【微信號(hào):TheAlgorithm,微信公眾號(hào):算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    聚徽制造業(yè)專屬工業(yè)觸摸屏:精準(zhǔn)控制每一道工序,提升生產(chǎn)精度

    在制造業(yè)競(jìng)爭(zhēng)日益激烈的當(dāng)下,產(chǎn)品質(zhì)量與生產(chǎn)效率成為企業(yè)立足市場(chǎng)的關(guān)鍵,而生產(chǎn)精度則是保障產(chǎn)品質(zhì)量的核心要素。制造業(yè)專屬工業(yè)觸摸屏憑借其獨(dú)特的功能與技術(shù)優(yōu)勢(shì),深度融入生產(chǎn)的每一道工序,實(shí)現(xiàn)對(duì)生
    的頭像 發(fā)表于 05-16 15:50 ?235次閱讀

    水文監(jiān)測(cè)中的雙軌纜小車和鉛魚(yú)纜小車

    一道堅(jiān)實(shí)的科技防線,那么這兩個(gè)設(shè)備有什么區(qū)別呢,原理又是怎么樣的呢?本文將探究竟。 ? ? ? ? 雙軌纜小車:通過(guò)兩根平行的軌道來(lái)引導(dǎo)小車的運(yùn)行,利用電機(jī)或其他動(dòng)力裝置驅(qū)動(dòng)小車在軌道上移動(dòng),小車通常配備有滑輪或滾輪,與
    的頭像 發(fā)表于 04-11 15:15 ?342次閱讀
    水文監(jiān)測(cè)中的雙軌纜<b class='flag-5'>道</b>小車和鉛魚(yú)纜<b class='flag-5'>道</b>小車

    成品電池綜合測(cè)試儀:電池品質(zhì)的最后一道把關(guān)人

    綜合測(cè)試儀便成為了電池生產(chǎn)線上的“最后一道把關(guān)人”,為電池品質(zhì)保駕護(hù)航。 成品電池綜合測(cè)試儀的重要性 成品電池綜合測(cè)試儀,是種集多種測(cè)試功能于體的專業(yè)設(shè)備,能夠?qū)﹄姵剡M(jìn)行全面的性能測(cè)試和評(píng)估。從電池的容量、
    的頭像 發(fā)表于 03-18 14:30 ?316次閱讀

    難度PCB不再難!捷多邦揭秘PCB制作難度層級(jí)

    。 簡(jiǎn)單型PCB 簡(jiǎn)單型PCB通常指的是單面板或雙面板,它們的設(shè)計(jì)相對(duì)簡(jiǎn)單,線路層數(shù)較少,元件密度低。這類PCB多用于些基礎(chǔ)的電子設(shè)備,如計(jì)算器、簡(jiǎn)單的家用電器等。由于設(shè)計(jì)和制作難度較低,它們是電子工程師入門學(xué)習(xí)的好選擇。 中等難度
    的頭像 發(fā)表于 03-05 17:04 ?621次閱讀

    英特爾的開(kāi)發(fā)板評(píng)測(cè)

    Linux系統(tǒng),測(cè)試比較方便,雖然Windows+Python代碼也可以開(kāi)發(fā),搞點(diǎn)難度的Ubuntu+ ? ? 配置下OpenVINO ,參考手冊(cè)。這個(gè)主要后面寫(xiě)代碼和轉(zhuǎn)模型用。但是我用C++寫(xiě)代碼
    的頭像 發(fā)表于 01-24 09:37 ?1102次閱讀
    英特爾的開(kāi)發(fā)板評(píng)測(cè)

    輸入電壓達(dá)到正負(fù)5v、精度比較高最好是12bit以上的,六通的ADC芯片般選哪幾種?

    輸入電壓達(dá)到正負(fù)5v、精度比較高最好是12bit以上的,六通的ADC芯片般選哪幾種,因?yàn)锳DC之后是直接接FPGA處理的、最好是那種ADC芯片好呢、性能越好越好、
    發(fā)表于 01-22 06:47

    硬件工程師面試??嫉?b class='flag-5'>一道,講講運(yùn)算放大器的增益帶寬積

    Part 01 前言 想要學(xué)好運(yùn)算放大器電路,個(gè)繞不過(guò)的參數(shù)就是增益帶寬積,只有理解了增益帶寬積,才能真正理解運(yùn)算放大器電路的增益與帶寬的關(guān)系。什么是增益帶寬積呢?英文名字叫GBP或GBW
    的頭像 發(fā)表于 12-27 08:13 ?4862次閱讀
    硬件工程師面試??嫉?b class='flag-5'>一道</b><b class='flag-5'>題</b>,講講運(yùn)算放大器的增益帶寬積

    ADS131E08輸入信號(hào)后都疊加在矩形波上,為什么?

    ,跳變大小為47000左右,ads配置為8通24位采樣16khz,輸入信號(hào)后都疊加在矩形波上 這是輸入正弦信號(hào)的圖形,都是疊加在矩形波上,模擬前端進(jìn)入adc之前信號(hào)沒(méi)問(wèn)題,不知道是什么原因后有
    發(fā)表于 12-18 06:36

    【「大話芯片制造」閱讀體驗(yàn)】+跟著本書(shū)”參觀“半導(dǎo)體工廠

    是什么? 難道是很多工藝會(huì)接觸危險(xiǎn)化學(xué)品,為了今次情況處理嗎? 配套設(shè)施,通過(guò)這里才知道氮?dú)?b class='flag-5'>一般是現(xiàn)場(chǎng)生產(chǎn)的,還有就是配套超純水供給很重要,之前就有了解過(guò)超純水清洗是很重要的一道工藝。 書(shū)中
    發(fā)表于 12-16 22:47

    ADS1256 8通依次采樣,數(shù)據(jù)不正確怎么解決?

    SPI總線速度1.40625MB/S,基于STM32的HAL庫(kù)下,對(duì)八通輸入同一道方波,方波頻率20HZ、40HZ、60HZ時(shí),會(huì)出現(xiàn)只有部分通道采樣的數(shù)據(jù)能顯示波形,輸入其他頻率的方波時(shí),會(huì)存在采樣到的數(shù)據(jù)顯示的波形占空比與輸入方波的占空比不相同,這種情況是屬于寄存器
    發(fā)表于 11-22 07:09

    IPV6報(bào)文怎么進(jìn)行通信

    寫(xiě)這篇文章的啟發(fā)是在群里,看到個(gè)小兄弟說(shuō)有嘗做一道IPV6的基礎(chǔ),看到該消息想著自己也沒(méi)啥事,就做下,弄個(gè)飯錢也還行,然后就開(kāi)始了。
    的頭像 發(fā)表于 10-25 09:36 ?799次閱讀
    IPV6報(bào)文怎么進(jìn)行通信

    使用DAC53608的八通可編程比較

    電子發(fā)燒友網(wǎng)站提供《使用DAC53608的八通可編程比較器.pdf》資料免費(fèi)下載
    發(fā)表于 10-08 11:26 ?0次下載
    使用DAC53608的八通<b class='flag-5'>道</b>可編程<b class='flag-5'>比較</b>器

    企業(yè)如何數(shù)字化轉(zhuǎn)型

    在當(dāng)今這個(gè)日新月異的數(shù)字時(shí)代,企業(yè)的數(shù)字化轉(zhuǎn)型已不再是一道選擇,而是一道必答題。它不僅關(guān)乎企業(yè)的生存與發(fā)展,更是決定企業(yè)能否在激烈的市場(chǎng)競(jìng)爭(zhēng)中脫穎而出的關(guān)鍵。 企業(yè)數(shù)字化轉(zhuǎn)型,簡(jiǎn)而言之,就是利用
    的頭像 發(fā)表于 08-27 16:55 ?892次閱讀

    好未來(lái)與微軟開(kāi)展合作,攜手構(gòu)建智慧學(xué)習(xí)生態(tài)系統(tǒng)

    想象下,你正在解一道復(fù)雜的數(shù)學(xué)。這難度不小,你解題時(shí)遇到了瓶頸。這時(shí),位“老師”出現(xiàn)在你
    的頭像 發(fā)表于 08-20 10:12 ?981次閱讀

    Verilog testbench問(wèn)題求助

    這是我在HDLbits網(wǎng)站上做到的一道,是testbench,請(qǐng)問(wèn)這個(gè)代碼為什么input都是低電平0?我設(shè)置的時(shí)鐘就是周期10ns,占空比50%的時(shí)鐘信號(hào)?。吭趺磿?huì)出現(xiàn)這種情況......
    發(fā)表于 07-21 11:14