哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

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

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

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

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

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

比如說題目給我們舉了幾個例子:

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

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

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

這個題目難度是 Hard,如果沒有做過類似的題目,還真做不出來。

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

其實,想判斷最終形成的圖形是否是完美矩形,需要從「面積」和「頂點」兩個角度來處理。

先說說什么叫從「面積」的角度。

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

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

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

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

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

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

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

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

代碼可以進(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:
#計算完美矩形的理論坐標(biāo)
X1,Y1=min(X1,x1),min(Y1,y1)
X2,Y2=max(X2,x2),max(Y2,y2)
#累加所有小矩形的面積
actual_area+=(x2-x1)*(y2-y1)

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

returnTrue

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

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

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

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

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

回到這道題,我們接下來的分析也有那么一點智力題的味道。

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

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

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

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

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

看下圖的四種情況:

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

圖中畫紅點的地方,什么時候是頂點,什么時候不是頂點?顯然,情況一和情況三的時候是頂點,而情況二和情況四的時候不是頂點。

也就是說,當(dāng)某一個點同時是 2 個或者 4 個小矩形的頂點時,該點最終不是頂點;當(dāng)某一個點同時是 1 個或者 3 個小矩形的頂點時,該點最終是一個頂點。

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

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

actual_area=0
#哈希集合,記錄最終圖形的頂點
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)
#先算出小矩形每個點的坐標(biāo)
p1,p2=(x1,y1),(x1,y2)
p3,p4=(x2,y1),(x2,y2)
#對于每個點,如果存在集合中,刪除它;
#如果不存在集合中,添加它;
#在集合中剩下的點都是出現(xiàn)奇數(shù)次的點
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

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

如果某一個頂點p存在于集合points中,則將它刪除;如果不存在于集合points中,則將它插入。

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

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

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

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

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

所以不僅要保證len(points) == 4,而且要保證points中最終剩下的點坐標(biāo)就是完美矩形的四個理論坐標(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:
#計算完美矩形的理論頂點坐標(biāo)
X1,Y1=min(X1,x1),min(Y1,y1)
X2,Y2=max(X2,x2),max(Y2,y2)
#累加小矩形的面積
actual_area+=(x2-x1)*(y2-y1)
#記錄最終形成的圖形中的頂點
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
#判斷最終留下的頂點個數(shù)是否為4
iflen(points)!=4:returnFalse
#判斷留下的4個頂點是否是完美矩形的頂點
if(X1,Y1)notinpoints:returnFalse
if(X1,Y2)notinpoints:returnFalse
if(X2,Y1)notinpoints:returnFalse
if(X2,Y2)notinpoints:returnFalse
#面積和頂點都對應(yīng),說明矩形符合題意
returnTrue

這就是最終的解法代碼,從「面積」和「頂點」兩個維度來判斷:

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

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

說實話,如果沒做過,這種特性真不是一時半會能想到的,但是看過一遍沒問題了,你學(xué)會了嗎?

責(zé)任編輯:xj

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

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


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

    關(guān)注

    3

    文章

    4421

    瀏覽量

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

    關(guān)注

    30

    文章

    4975

    瀏覽量

    74334

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

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

    芯片的“第一道體檢”:文讀懂CP測試,半導(dǎo)體人必看!

    在芯片從晶圓到成品的漫長旅程里,有一道看不見卻至關(guān)重要的關(guān)卡——CP測試。它被稱為芯片良率的“守門員”、封裝成本的“節(jié)流閥”,更是半導(dǎo)體產(chǎn)業(yè)鏈里前端制造與后端封測之間的關(guān)鍵樞紐。今天這篇,用通俗
    的頭像 發(fā)表于 04-17 10:03 ?187次閱讀
    芯片的“第<b class='flag-5'>一道</b>體檢”:<b class='flag-5'>一</b>文讀懂CP測試,半導(dǎo)體人必看!

    EOL測試系統(tǒng)——電池包下線前的最后一道品質(zhì)防線

    在儲能電池包的生產(chǎn)線上,EOL測試系統(tǒng) 是產(chǎn)品交付前的最后一道關(guān)口,也是最重要的品質(zhì)防線。EOL測試的全面性與可靠性,直接決定了流入市場的儲能產(chǎn)品是否存在早期失效風(fēng)險。 個完整的電池包EOL測試
    的頭像 發(fā)表于 03-23 16:40 ?334次閱讀
    EOL測試系統(tǒng)——電池包下線前的最后<b class='flag-5'>一道</b>品質(zhì)防線

    紅區(qū)破局之道:為什么防逆流裝置是“第一道防線”?

    當(dāng)之無愧的“第一道防線”。它不像四可裝置那樣兼具“可觀可測、可控可調(diào)”的全鏈條能力,卻能以最直接、最精準(zhǔn)的方式,守住紅區(qū)光伏并網(wǎng)的安全底線,為后續(xù)精細(xì)化管控、高效消納筑牢基礎(chǔ)——沒有這道防線,紅區(qū)光伏的合規(guī)運營、收益保障都將無從談起。
    的頭像 發(fā)表于 03-16 15:32 ?763次閱讀
    紅區(qū)破局之道:為什么防逆流裝置是“第<b class='flag-5'>一道</b>防線”?

    智慧礦山能耗監(jiān)測新模式!投入減半,運維0成本!

    國家“雙碳”戰(zhàn)略的發(fā)條越擰越緊。對于礦山、化工、建材等高耗能行業(yè)來說,這不再是一道“加分”,而是一道“生死”。尤其是礦石選別環(huán)節(jié),破碎、篩分、磨礦三大工序的電耗占比往往超過全廠的7
    的頭像 發(fā)表于 02-04 17:02 ?571次閱讀
    智慧礦山能耗監(jiān)測新模式!投入減半,運維0成本!

    探索MAX965 - MAX970系列比較器:低功耗與高性能的完美結(jié)合

    探索MAX965 - MAX970系列比較器:低功耗與高性能的完美結(jié)合 在電子設(shè)計領(lǐng)域,對于低功耗、高性能的追求從未停止。今天,我們就來深入了解下Maxim Integrated推出的MAX965
    的頭像 發(fā)表于 01-08 16:20 ?387次閱讀

    MAX516:可編程閾值的四通比較器的特性與應(yīng)用

    MAX516:可編程閾值的四通比較器的特性與應(yīng)用 在電子設(shè)計領(lǐng)域,比較器是種常見且重要的器件,而今天要為大家介紹的MAX516是款具有
    的頭像 發(fā)表于 01-08 14:25 ?319次閱讀

    Maxim MAX985/986/989/990/993/994系列比較器:低功耗與高性能的完美結(jié)合

    Maxim MAX985/986/989/990/993/994系列比較器:低功耗與高性能的完美結(jié)合 在電子工程師的日常設(shè)計中,比較器是種常用的基礎(chǔ)元件,它在信號處理、閾值檢測等諸多
    的頭像 發(fā)表于 01-08 13:50 ?770次閱讀

    探索MAX985/MAX986等系列比較器:低功耗與高性能的完美結(jié)合

    探索MAX985/MAX986等系列比較器:低功耗與高性能的完美結(jié)合 在電子設(shè)計領(lǐng)域,比較器是種常見且關(guān)鍵的器件,它能對兩個輸入信號進(jìn)行比較
    的頭像 發(fā)表于 01-08 13:50 ?419次閱讀

    Maxim MAX985/986/989/990/993/994 比較器:低功耗與高性能的完美結(jié)合

    。 文件下載: MAX986.pdf 、產(chǎn)品概述 MAX985/986/989/990/993/994 系列包含單通道、雙通道和四通微功耗比較器,具有低電壓工作和軌到軌輸入輸
    的頭像 發(fā)表于 01-08 10:35 ?593次閱讀

    Maxim Integrated的MAX系列比較器,低功耗與高性能的完美結(jié)合

    : MAX985.pdf 、產(chǎn)品概述 這系列產(chǎn)品包含單通道、雙通道和四通的微功耗比較器,具備低電壓工作能力,輸入輸出都是軌到軌的。其工作電壓
    的頭像 發(fā)表于 01-08 10:25 ?371次閱讀

    3秒響應(yīng)、實時告警!智能井蓋如何成為城市安全的“第一道防線”?

    IP68防護(hù)、-40℃~80℃寬溫運行及10年超長續(xù)航,支持自定義報警閾值與多級告警機(jī)制,大幅降低誤報率。作為城市物聯(lián)網(wǎng)感知層的關(guān)鍵節(jié)點,智能井蓋已融入智慧城管與應(yīng)急管理體系,成為守護(hù)市民腳下安全的“第一道防線”。
    的頭像 發(fā)表于 12-09 11:57 ?442次閱讀
    3秒響應(yīng)、實時告警!智能井蓋如何成為城市安全的“第<b class='flag-5'>一道</b>防線”?

    不間斷電源(UPS):電力保障的“最后一道防線”

    (UninterruptiblePowerSupply,簡稱UPS)作為電力保障的“最后一道防線”,通過儲能裝置與智能轉(zhuǎn)換技術(shù),在市電中斷時實現(xiàn)零切換時間供電,成為現(xiàn)代社會的“電力守護(hù)者”。、UP
    的頭像 發(fā)表于 10-29 09:02 ?1917次閱讀
    不間斷電源(UPS):電力保障的“最后<b class='flag-5'>一道</b>防線”

    鉛酸蓄電池在線監(jiān)測:為關(guān)鍵基礎(chǔ)設(shè)施筑牢“最后一道防線”

    在數(shù)據(jù)中心、通信基站、軌道交通等關(guān)鍵應(yīng)用場景中,蓄電池組往往是供電系統(tǒng)的“最后一道屏障”。旦蓄電池出現(xiàn)故障,可能導(dǎo)致系統(tǒng)斷電、數(shù)據(jù)丟失甚至設(shè)備損壞,帶來不可估量的經(jīng)濟(jì)損失和安全風(fēng)險。因此,對蓄電池
    的頭像 發(fā)表于 09-23 09:31 ?764次閱讀
    鉛酸蓄電池在線監(jiān)測:為關(guān)鍵基礎(chǔ)設(shè)施筑牢“最后<b class='flag-5'>一道</b>防線”

    頂堅國產(chǎn)防爆手持終端如何成為石化企業(yè)安全生產(chǎn)的第一道防線

    頂堅國產(chǎn)防爆手持終端之所以能成為石化企業(yè)安全生產(chǎn)的第一道防線,源于其通過防爆設(shè)計、功能集成、實時交互與系統(tǒng)協(xié)同,從物理安全、功能安全、管理安全、應(yīng)急安全等維度,覆蓋了安全生產(chǎn)的全流程(預(yù)防、監(jiān)測
    的頭像 發(fā)表于 08-26 10:31 ?968次閱讀
    頂堅國產(chǎn)防爆手持終端如何成為石化企業(yè)安全生產(chǎn)的第<b class='flag-5'>一道</b>防線

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

    在制造業(yè)競爭日益激烈的當(dāng)下,產(chǎn)品質(zhì)量與生產(chǎn)效率成為企業(yè)立足市場的關(guān)鍵,而生產(chǎn)精度則是保障產(chǎn)品質(zhì)量的核心要素。制造業(yè)專屬工業(yè)觸摸屏憑借其獨特的功能與技術(shù)優(yōu)勢,深度融入生產(chǎn)的每一道工序,實現(xiàn)對生
    的頭像 發(fā)表于 05-16 15:50 ?845次閱讀
    和政县| 绥中县| 沂源县| 汉川市| 广水市| 萍乡市| 泗阳县| 左云县| 民勤县| 大渡口区| 威信县| 罗山县| 安福县| 通化市| 玛纳斯县| 昭苏县| 四会市| 莆田市| 额济纳旗| 合阳县| 宜城市| 和平区| 永善县| 通许县| 迁安市| 五华县| 平顺县| 开阳县| 高邮市| 扎囊县| 珲春市| 甘洛县| 东宁县| 天柱县| 平山县| 萍乡市| 大姚县| 绥滨县| 张家界市| 本溪| 固始县|