色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

算法與數據結構 ? 來源:算法與數據結構 ? 作者:labuladong ? 2021-01-04 14:17 ? 次閱讀

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

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

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

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

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,如果沒有做過類似的題目,還真做不出來。

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

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

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

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

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

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

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

#左下角頂點,初始化為正無窮,以便記錄最小值
X1,Y1=float('inf'),float('inf')
#右上角頂點,初始化為負無窮,以便記錄最大值
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)

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

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

代碼可以進一步:

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:
#計算完美矩形的理論坐標
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)
#面積應該相同
ifactual_area!=expected_area:
returnFalse

returnTrue

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

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

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

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

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

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

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

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

PS:我也不知道應該用「頂點」還是「角」來形容,好像都不太準確,本文統一用「頂點」來形容,大家理解就好~

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

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

看下圖的四種情況:

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

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

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

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

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)
#先算出小矩形每個點的坐標
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

returnTrue

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

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

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

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

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

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

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

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

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:
#計算完美矩形的理論頂點坐標
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
#判斷最終留下的頂點個數是否為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
#面積和頂點都對應,說明矩形符合題意
returnTrue

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

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

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

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

責任編輯:xj

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

文章出處:【微信公眾號:算法與數據結構】歡迎添加關注!文章轉載請注明出處。


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 函數
    +關注

    關注

    3

    文章

    4333

    瀏覽量

    62684
  • 代碼
    +關注

    關注

    30

    文章

    4791

    瀏覽量

    68677

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

文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數據結構】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    硬件工程師面試常考的一道,講講運算放大器的增益帶寬積

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

    ADS131E08輸入信號后都疊加在矩形波上,為什么?

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

    【「大話芯片制造」閱讀體驗】+跟著本書”參觀“半導體工廠

    是什么? 難道是很多工藝會接觸危險化學品,為了今次情況處理嗎? 配套設施,通過這里才知道氮氣般是現場生產的,還有就是配套超純水供給很重要,之前就有了解過超純水清洗是很重要的一道工藝。 書中
    發表于 12-16 22:47

    ADS1256 8通依次采樣,數據不正確怎么解決?

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

    IPV6報文怎么進行通信

    寫這篇文章的啟發是在群里,看到個小兄弟說有嘗做一道IPV6的基礎,看到該消息想著自己也沒啥事,就做下,弄個飯錢也還行,然后就開始了。
    的頭像 發表于 10-25 09:36 ?256次閱讀
    IPV6報文怎么進行通信

    用tas5711做2.1聲,低音15w和R/L各8w,喇叭用多歐比較合適?

    計劃用tas5711做2.1聲,低音15w和R/L各8w,喇叭用多歐比較合適?
    發表于 10-09 06:00

    使用DAC53608的八通可編程比較

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

    企業如何數字化轉型

    在當今這個日新月異的數字時代,企業的數字化轉型已不再是一道選擇,而是一道必答題。它不僅關乎企業的生存與發展,更是決定企業能否在激烈的市場競爭中脫穎而出的關鍵。 企業數字化轉型,簡而言之,就是利用
    的頭像 發表于 08-27 16:55 ?402次閱讀

    好未來與微軟開展合作,攜手構建智慧學習生態系統

    想象下,你正在解一道復雜的數學。這難度不小,你解題時遇到了瓶頸。這時,位“老師”出現在你
    的頭像 發表于 08-20 10:12 ?541次閱讀

    Verilog testbench問題求助

    這是我在HDLbits網站上做到的一道,是testbench,請問這個代碼為什么input都是低電平0?我設置的時鐘就是周期10ns,占空比50%的時鐘信號啊?怎么會出現這種情況......
    發表于 07-21 11:14

    遲滯比較器和滯回比較器是樣的嗎

    遲滯比較器和滯回比較器是兩種不同的電路,它們在功能和應用上有所區別。 遲滯比較器(Hysteresis Comparator) 遲滯比較器是
    的頭像 發表于 07-11 09:26 ?1923次閱讀

    種新的微帶線和矩形波導集成形結構研究

    矩形波導可用于設計高Q值的元件,但需要復雜的轉換結構實現與平面電路的集成。目前已經有些針對微帶線和矩形波導轉換結構的研究,然而,傳統的矩形波導平面結構集成方案體積龐大,通常也需要精密
    的頭像 發表于 05-30 14:26 ?679次閱讀
    <b class='flag-5'>一</b>種新的微帶線和<b class='flag-5'>矩形</b>波導集成形結構研究

    stm8 TIM2通1的比較輸出無法進入中斷的原因?

    我的目的是利用TIM2通1的比較輸出模式(翻轉模式),在翻轉的情況下能產生個中斷,以便在中斷內記錄翻轉的次數。但是發現直無法進入中斷函數TIM2_CC_IRQHandler (v
    發表于 05-14 06:53

    數據安全的最后一道防線是數據加密

    信息數據安全領域最薄弱的環節是人,也指人為威脅。 人為威脅可分為無意識的和有意識的。 無意威脅是指因管理和用戶操作失誤而導致的信息泄露或破壞。有意威脅是指某些組織或個人為了自己的目的或利益,直接破壞各種設備,竊取和盜用有價值的數據信息,制造和傳播病毒,或改變系統功能等,這種有意識的威脅最值得關注。 企業的信息數據通常通過聊天工具、電子郵件、網盤、移動存儲和智能手機等渠道泄露。但這些途徑也是最受歡迎的企業
    的頭像 發表于 05-10 13:43 ?342次閱讀

    18年,6570個日夜,小熊電器何以撩動年輕人?

    小熊電器,用十八年解一道“年輕方程式”
    的頭像 發表于 03-25 09:23 ?1895次閱讀
    18年,6570個日夜,小熊電器何以撩動年輕人?
    主站蜘蛛池模板: 精品一品国产午夜福利视频 | 毛片在线网址| 久久精品中文騷妇女内射| 久久亚洲一级α片| 美女大本营| 青柠在线观看免费播放电影 | 精品第一国产综合精品蜜芽| 精品九九视频| 蜜芽无码亚洲资源网站| 人人啪日日观看在线| 脱女学小内内摸出水网站免费| 亚洲AV无码国产精品色在线看| 亚洲人成77777| 91av影院| 国产成人精品综合久久久| 国拍在线精品视频免费观看| 久久亚洲精品成人| 欧美一道本一区二区三区| 四虎影视国产精品亚洲精品hd| 亚洲国产AV无码综合在线| 在线免费观看毛片| 拔萝卜电视剧高清免费| 国产婷婷色综合AV蜜臀AV| 久青草国产在视频在线观看| 让男人玩尿道的女人| 亚洲 日韩 在线 国产 精品| 中文人妻熟妇精品乱又伦| 成人亚洲视频在线观看| 黑人 尺寸 强行害怕 痛哭| 免费视频亚洲| 无人影院在线播放| 18 japanese宾馆直播| 囯产精品久久久久久久久蜜桃| 精品粉嫩BBWBBZBBW| 全身无赤裸裸美女网站| 亚洲午夜性春猛交XXXX| wankz tv videos国产| 黑人操日本女人| 热巴两次用约老师屁股发底线球| 亚洲精品国产品国语在线试看| ai换脸在线全集观看|