-
Notifications
You must be signed in to change notification settings - Fork 4.9k
/
PerfectRectangle.cpp
80 lines (77 loc) · 2.11 KB
/
PerfectRectangle.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
// Source : https://leetcode.com/problems/perfect-rectangle/
// Author : Hao Chen
// Date : 2016-09-08
/***************************************************************************************
*
* Given N axis-aligned rectangles where N > 0, determine if they all together form an
* exact cover of a rectangular region.
*
* Each rectangle is represented as a bottom-left point and a top-right point. For
* example, a unit square is represented as [1,1,2,2]. (coordinate of bottom-left point
* is (1, 1) and top-right point is (2, 2)).
*
* Example 1:
*
* rectangles = [
* [1,1,3,3],
* [3,1,4,2],
* [3,2,4,4],
* [1,3,2,4],
* [2,3,3,4]
* ]
*
* Return true. All 5 rectangles together form an exact cover of a rectangular region.
*
* Example 2:
*
* rectangles = [
* [1,1,2,3],
* [1,3,2,4],
* [3,1,4,2],
* [3,2,4,4]
* ]
*
* Return false. Because there is a gap between the two rectangular regions.
*
* Example 3:
*
* rectangles = [
* [1,1,3,3],
* [3,1,4,2],
* [1,3,2,4],
* [3,2,4,4]
* ]
*
* Return false. Because there is a gap in the top center.
*
* Example 4:
*
* rectangles = [
* [1,1,3,3],
* [3,1,4,2],
* [1,3,2,4],
* [2,2,4,4]
* ]
*
* Return false. Because two of the rectangles overlap with each other.
***************************************************************************************/
class Solution {
public:
bool isRectangleCover(vector<vector<int>>& rectangles) {
unordered_map<string,int> mp;
string corners[4];
for(auto v: rectangles)
for(int i = 0; i<4; ++i){
corners[i] = to_string(v[i/2*2]) + "," + to_string(v[(i%2)*2+1]);
if(mp[corners[i]] & int(pow(2,i))) return false;
else mp[corners[i]] |= int(pow(2,i));
}
int corner = 0;
for(auto i=mp.begin(); i!=mp.end(); ++i){
int val = i->second;
if(!(val & (val-1)) && (++corner >4)) return false;
if((val & (val-1)) && !(val == 3 || val==12 || val==10 || val==5 || val==15)) return false;
}
return true;
}
};