<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          ?LeetCode刷題實(shí)戰(zhàn)391:完美矩形

          共 6435字,需瀏覽 13分鐘

           ·

          2021-09-27 07:18

          算法的重要性,我就不多說了吧,想去大廠,就必須要經(jīng)過基礎(chǔ)知識(shí)和業(yè)務(wù)邏輯面試+算法面試。所以,為了提高大家的算法能力,這個(gè)公眾號(hào)后續(xù)每天帶大家做一道算法題,題目就從LeetCode上面選 !

          今天和大家聊的問題叫做 完美矩形,我們先來看題面:
          https://leetcode-cn.com/problems/perfect-rectangle/

          Given an array rectangles where rectangles[i] = [xi, yi, ai, bi] represents an axis-aligned rectangle. The bottom-left point of the rectangle is (xi, yi) and the top-right point of it is (ai, bi). 


          Return true if all the rectangles together form an exact cover of a rectangular region.

          我們有 N 個(gè)與坐標(biāo)軸對(duì)齊的矩形, 其中 N > 0, 判斷它們是否能精確地覆蓋一個(gè)矩形區(qū)域。
          每個(gè)矩形用左下角的點(diǎn)和右上角的點(diǎn)的坐標(biāo)來表示。例如, 一個(gè)單位正方形可以表示為 [1,1,2,2]。( 左下角的點(diǎn)的坐標(biāo)為 (1, 1) 以及右上角的點(diǎn)的坐標(biāo)為 (2, 2) )。

          示例


          示例 1:
          rectangles = [
            [1,1,3,3],
            [3,1,4,2],
            [3,2,4,4],
            [1,3,2,4],
            [2,3,3,4]
          ]
          返回 true5個(gè)矩形一起可以精確地覆蓋一個(gè)矩形區(qū)域。

          示例 2:
          rectangles = [
            [1,1,2,3],
            [1,3,2,4],
            [3,1,4,2],
            [3,2,4,4]
          ]
          返回 false。兩個(gè)矩形之間有間隔,無法覆蓋成一個(gè)矩形。

          示例 3:
          rectangles = [
            [1,1,3,3],
            [3,1,4,2],
            [1,3,2,4],
            [3,2,4,4]
          ]
          返回 false。圖形頂端留有間隔,無法覆蓋成一個(gè)矩形。

          示例 4:
          rectangles = [
            [1,1,3,3],
            [3,1,4,2],
            [1,3,2,4],
            [2,2,4,4]
          ]

          返回 false。因?yàn)橹虚g有相交區(qū)域,雖然形成了矩形,但不是精確覆蓋。


          解題

          https://blog.csdn.net/Forlogen/article/details/109827717

          何謂完美矩形?根據(jù)題目的描述可知,給定的所有小矩形如能構(gòu)成完美矩形,需滿足如下的條件:

          所有小矩形構(gòu)成的圖形仍然是一個(gè)矩形
          構(gòu)成的矩形不能有重疊和空缺部分
          以題目給定的第一個(gè)例子進(jìn)行說明,給定小矩形的情況如下所示:


          如上圖所示,給定的5個(gè)小矩形剛好組成一個(gè)大的矩形,大矩形的左下角和右上角坐標(biāo)分別是[1,1]和[4,4]。矩形之間沒有重疊部分,大矩形中間也沒有空缺。再去看其他例子,應(yīng)該就能明白為什么不能構(gòu)成完美矩形了。

          那么如何判斷給定的例子滿足要求呢?對(duì)于一個(gè)單獨(dú)的矩形來說,它包含點(diǎn)和面積兩大要素。如果要構(gòu)成完美矩形,首先,所有小矩形相加的面積之和要等于完美矩形的面積。而想要知道完美矩形的面積,又必須首先知道它的左下角[X1,Y1]和右上角坐標(biāo)[X2,Y2]。而[X1,Y1]就是所有小矩形坐標(biāo)中最靠左下角的那個(gè),[X2,Y2]是所有小矩形坐標(biāo)最靠右上角的那個(gè)。知道了[X1,Y1]和[X2,Y2],必然可以計(jì)算出完美矩形的面積,只有小矩形的面積之和等于完美矩形的面積,對(duì)應(yīng)的結(jié)果才可能為true。

          但是面積相等只能說有希望構(gòu)成完美矩形,并可能一錘定音。如下所示,所有的小矩形構(gòu)成了一個(gè)大矩形,雖然有一個(gè)單位的空缺,但恰好有一個(gè)單位的重疊。因此,如果單純從面積相等判斷好像是可行的,但顯然是無法滿足要求的。


          因此,我們還需要從點(diǎn)的角度進(jìn)行進(jìn)一步判斷。下面給出一個(gè)合法的例子如左圖所示,不合法的例子如右圖所示,同時(shí)用數(shù)字標(biāo)記了所有小矩形包包含的頂點(diǎn)出現(xiàn)的次數(shù)。可以發(fā)現(xiàn),合法的例子中,出現(xiàn)次數(shù)為1的頂點(diǎn)就是最后完美矩形的四個(gè)頂點(diǎn),其他的頂點(diǎn)都出現(xiàn)了兩次。而不合法的例子中,出現(xiàn)次數(shù)為1的頂點(diǎn)不只是完美矩形的四個(gè)頂點(diǎn)。

          因此,我們可以在遍歷小矩形的同時(shí)記錄頂點(diǎn)出現(xiàn)的情況。如果當(dāng)前頂點(diǎn)沒有遍歷過,則將其加入到集合中,否則將其從集合中刪除。如果最后集合中只包含可能的完美矩形的四個(gè)頂點(diǎn),那么說明例子是合法的,否則說明無法構(gòu)成完美矩形。

          總結(jié),如果解該題需要遍歷所有的小矩形,遍歷過程中需要等到完美矩形的左下角和右上角坐標(biāo)、矩形面積之和,以及頂點(diǎn)的出現(xiàn)情況,最后,判斷小矩形面積之和和完美矩形面積之和是否相等,集合中是否只包含4個(gè)頂點(diǎn)且是完美矩形的四個(gè)頂點(diǎn),只有這兩個(gè)條件同時(shí)滿足才能構(gòu)成完美矩形。

          解碼代碼如下所示:

          class Solution {
              public boolean isRectangleCover(int[][] rectangles) {
                  // 完美矩形的左下角和右上角坐標(biāo)
                  int X1 = Integer.MAX_VALUE, Y1 = Integer.MAX_VALUE;
                  int X2 = Integer.MIN_VALUE, Y2 = Integer.MIN_VALUE;
              
                  // 小矩形面積之和
                  int areas = 0;
                  // 記錄所有頂點(diǎn)的出現(xiàn)情況
                  Set<String> points = new HashSet<>();
                  for (int[] rectangle : rectangles) {
                      int x1 = rectangle[0], y1 = rectangle[1], x2 = rectangle[2], y2 = rectangle[3];
                      // 更新坐標(biāo)
                      X1 = Math.min(x1, X1);
                      Y1 = Math.min(y1, Y1);
                      X2 = Math.max(x2, X2);
                      Y2 = Math.max(y2, Y2);

                      areas += (x2 - x1) * (y2 - y1);
                      // 判斷頂點(diǎn)是否出現(xiàn)過
                      String[] ps = {x1 + " " + y1, x2 + " " + y2, x1 + " " + y2, x2 + " " + y1};
                      for (String s : ps) {
                          // 沒有出現(xiàn)過,添加;否則,移除
                          if(points.contains(s)){
                              points.remove(s);
                          } else {
                              points.add(s);
                          }
                      }
                  }
              
                  // 面積是否相等
                  int expected = (X2 - X1) * (Y2 -Y1);
                  if(areas != expected){
                      return false;
                  }
                  // 頂點(diǎn)情況是否滿足
                  if(points.size() != 4 || !points.contains(X1 + " " + Y1) || !points.contains(X2 + " " + Y2) || !points.contains(X1 + " " + Y2) || !points.contains(X2 + " " + Y1)){
                      return false;
                  }
                  return true;
              }
          }

          好了,今天的文章就到這里,如果覺得有所收獲,請(qǐng)順手點(diǎn)個(gè)在看或者轉(zhuǎn)發(fā)吧,你們的支持是我最大的動(dòng)力 。

          上期推文:

          LeetCode1-380題匯總,希望對(duì)你有點(diǎn)幫助!

          LeetCode刷題實(shí)戰(zhàn)381:O(1) 時(shí)間插入、刪除和獲取隨機(jī)元素

          LeetCode刷題實(shí)戰(zhàn)382:鏈表隨機(jī)節(jié)點(diǎn)

          LeetCode刷題實(shí)戰(zhàn)383:贖金信

          LeetCode刷題實(shí)戰(zhàn)384:打亂數(shù)組

          LeetCode刷題實(shí)戰(zhàn)385:迷你語法分析器

          LeetCode刷題實(shí)戰(zhàn)386:字典序排數(shù)
          LeetCode刷題實(shí)戰(zhàn)387:字符串中的第一個(gè)唯一字符
          LeetCode刷題實(shí)戰(zhàn)388:文件的最長(zhǎng)絕對(duì)路徑
          LeetCode刷題實(shí)戰(zhàn)389:找不同
          LeetCode刷題實(shí)戰(zhàn)390:消除游戲

          瀏覽 11
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  人人要人人射 | 欧美三级视频在线观看 | 免费看操逼大片 | wwwav视频 | 欧美成人A片高清免费看 |