摘要:首先確定上下的邊界,左右線段按照橫坐標排序。檢查填充滿上圖的情況就組成不了一個長方形。找重合和有空隙只需要把所有橫坐標在的線段排序之后檢查首位相連,且起點,終點。且最后成的面積等于小矩形的面積和。
Perfect Rectangle
題目鏈接:https://leetcode.com/problems...
掃描線,哪個方向都行。我是從左往右掃,矩陣按照左右的邊來存。
首先確定上下的邊界,左右線段按照橫坐標排序。然后從左往右,如果碰到left的邊,就加到集合里,碰到right的邊,就從remove掉。
檢查重合面積:每次加left的邊之前,檢查一下集合里面的邊是否有和當前left重合的情況,這里集合可以用heap。這里如果橫坐標相同先remove right的邊,再加left。
檢查填充滿:上圖的情況就組成不了一個長方形。那么這時候,每次加進集合的線段是無法填充滿up到down的這整條線段的。把橫坐標相同的線段按up點排序。每次檢查相同x的線段,是否從上到下組成了邊界的線段,組成不了就不滿足題目要求。每次右邊全部remove完的時候記錄下橫坐標: prev_x,和下一次add的橫坐標比較,不相同說明中間有gap。
這道題由于只要找是否重合不需要計算重合的面積和是否有空隙,所以計算相對簡單一點。找重合和有空隙只需要把所有橫坐標在x的線段排序之后檢查首位相連,且起點 = down,終點 = up。這方法超時了,看了discussion的做法,是直接記y軸上線段的長度,然后和up - down比較,這樣比較時間就是O(1)了,利用TreeSet來找重合。參考discussion:
https://discuss.leetcode.com/...
public class Solution { public boolean isRectangleCover(int[][] rectangles) { // store the rect as left, right lines Listlines = new ArrayList(); int up = Integer.MIN_VALUE, down = Integer.MAX_VALUE; for(int[] rect : rectangles) { // x, down, up, left or right lines.add(new int[] {rect[0], rect[1], rect[3], -1}); lines.add(new int[] {rect[2], rect[1], rect[3], 1}); up = Math.max(up, rect[3]); down = Math.min(down, rect[1]); } // sort: 1. x, 2. right -> left, 3. down Collections.sort(lines, (a, b) -> a[0] == b[0] ? (a[3] == b[3] ? a[1] - b[1] : b[3] - a[3]) : a[0] - b[0]); // 1. non intersection: a.up >= b.down if a.down > b.down TreeSet heap = new TreeSet<>((a, b) -> a.up <= b.down ? -1 : (a.down >= b.up ? 1 : 0)); // loop invariant: prev_x = cur_x, cur_x: left line int i = 0; int prev_x = lines.get(0)[0]; // length in y int len = 0; while(i < lines.size()) { int cur_x = lines.get(i)[0]; while(i < lines.size() && lines.get(i)[0] == cur_x) { int[] cur = lines.get(i); Line line = new Line(cur[1], cur[2]); // left line if(cur[3] == -1) { // overlap if(!heap.add(line)) return false; len += line.up - line.down; } // right else { heap.remove(line); len -= line.up - line.down; } i++; } if(i != lines.size() && len != up - down) return false; } return true; } } class Line { int up; int down; Line(int down, int up) { this.down = down; this.up = up; } @Override public int hashCode() { return this.up * this.down; } @Override public boolean equals(Object a) { if(a instanceof Line) { Line b = (Line) a; return this.up == b.up && this.down == b.down; } return false; } }
這題還有個規律,除了四個頂點只出現一次以外,其他所有點都出現兩次。且最后成的面積等于小矩形的面積和。
https://discuss.leetcode.com/...
public class Solution { public boolean isRectangleCover(int[][] rectangles) { int x1 = Integer.MAX_VALUE, x2 = Integer.MIN_VALUE, y1 = Integer.MAX_VALUE, y2 = Integer.MIN_VALUE; int area = 0; Setset = new HashSet(); for(int[] rect : rectangles) { area += (rect[2] - rect[0]) * (rect[3] - rect[1]); x1 = Math.min(x1, rect[0]); y1 = Math.min(y1, rect[1]); x2 = Math.max(x2, rect[2]); y2 = Math.max(y2, rect[3]); String s1 = rect[0] + " " + rect[1]; String s2 = rect[0] + " " + rect[3]; String s3 = rect[2] + " " + rect[1]; String s4 = rect[2] + " " + rect[3]; if(!set.add(s1)) set.remove(s1); if(!set.add(s2)) set.remove(s2); if(!set.add(s3)) set.remove(s3); if(!set.add(s4)) set.remove(s4); } // condition 1 if(area != (x2 - x1) * (y2 - y1)) return false; // condition 2 return set.contains(x1 + " " + y1) && set.contains(x1 + " " + y2) && set.contains(x2 + " " + y1) && set.contains(x2 + " " + y2) && set.size() == 4; } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/66607.html
摘要:題目要求用一個二維數組來表示一堆矩形,二維數組中的每一行分別記錄矩形左下角和右上角的坐標。該理想情況下矩形的面積應當等于所有矩形的面積之和。一旦不相等,則一定無法構成大的矩形。其次,光判斷面積并不足夠,可以這樣三個矩形構成的圖形。 題目要求 Given N axis-aligned rectangles where N > 0, determine if they all togeth...
Find the Difference User Accepted: 812User Tried: 861Total Accepted: 1362Total Submissions: 1552Difficulty: Easy Given two strings s and t which consist of only lowercase letters. String t is generate...
摘要:自從兩周前發布新款服務器軟件開發助手以來,熱評不斷,程序員們爆發出異乎尋常的熱情。我們注意到有中國區的用戶在使用時,遭遇到更新過慢的問題。感謝網友對這個問題的貢獻,現在已經有了很好的解決方法。首先,請自行到注冊一下,獲得到一個鏡像鏈接。 自從兩周前Perfect 發布新款服務器軟件開發助手 Perfect Assistant以來,熱評不斷,程序員們爆發出異乎尋常的熱情。 我們注意到有中...
摘要:動態規劃復雜度時間空間思路如果一個數可以表示為一個任意數加上一個平方數,也就是,那么能組成這個數最少的平方數個數,就是能組成最少的平方數個數加上因為已經是平方數了。 Perfect Squares Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4...
閱讀 1039·2021-11-18 13:23
閱讀 746·2021-11-08 13:16
閱讀 856·2021-10-11 10:58
閱讀 3511·2021-09-22 15:26
閱讀 1732·2021-09-08 10:42
閱讀 1807·2021-09-04 16:45
閱讀 1734·2019-08-30 15:54
閱讀 2565·2019-08-30 13:45