## Description

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.


## Solutions

每一个矩形用左下角和右上角的坐标来表示，原点是左下角的位置，每四个坐标为一组表示一个矩形，看这几组坐标是否能构成一个矩形。

### 1. Hash Table

class Solution:
def isRectangleCover(self, rectangles: List[List[int]]) -> bool:
#除了四个顶点之外小矩形的顶点成对出现
lookup = set()
area = 0
x_min, y_min, x_max, y_max = float('inf'), float('inf'), -float('inf'), -float('inf')
for x1, y1, x2, y2 in rectangles:
x_min = min(x_min, x1)
y_min = min(y_min, y1)
x_max = max(x_max, x2)
y_max = max(y_max, y2)
area += (y2 - y1) * (x2 - x1)
for point in [(x1, y1), (x1, y2), (x2, y1), (x2, y2)]:
if point in lookup:
lookup.remove(point)
else:
if len(lookup) != 4 or (x_min, y_min) not in lookup or (x_min, y_max) not in lookup \
or (x_max, y_min) not in lookup or (x_max, y_max) not in lookup:
return False
return area == (y_max - y_min) * (x_max - x_min)

# 46/46 cases passed (372 ms)
# Your runtime beats 81.42 % of python3 submissions
# Your memory usage beats 50 % of python3 submissions (19.7 MB)