# 完美矩形

我们有 N 个与坐标轴对齐的矩形, 其中 N > 0, 判断它们是否能精确地覆盖一个矩形区域。

每个矩形用左下角的点和右上角的点的坐标来表示。例如, 一个单位正方形可以表示为 [1,1,2,2]。 ( 左下角的点的坐标为 (1, 1) 以及右上角的点的坐标为 (2, 2) )。

示例 1:

rectangles = [
  [1,1,3,3],
  [3,1,4,2],
  [3,2,4,4],
  [1,3,2,4],
  [2,3,3,4]
]

返回 true。5个矩形一起可以精确地覆盖一个矩形区域。

 

示例 2:

rectangles = [
  [1,1,2,3],
  [1,3,2,4],
  [3,1,4,2],
  [3,2,4,4]
]

返回 false。两个矩形之间有间隔,无法覆盖成一个矩形。

 

示例 3:

rectangles = [
  [1,1,3,3],
  [3,1,4,2],
  [1,3,2,4],
  [3,2,4,4]
]

返回 false。图形顶端留有间隔,无法覆盖成一个矩形。

 

示例 4:

rectangles = [
  [1,1,3,3],
  [3,1,4,2],
  [1,3,2,4],
  [2,2,4,4]
]

返回 false。因为中间有相交区域,虽然形成了矩形,但不是精确覆盖。
## template ```cpp #include using namespace std; class Solution { public: bool isRectangleCover(vector> &ret) { set> s; int x1 = INT_MAX, y1 = INT_MAX, x2 = INT_MIN, y2 = INT_MIN, area = 0; for (int i = 0; i < ret.size(); ++i) { x1 = min(ret[i][0], x1); x2 = max(ret[i][2], x2); y1 = min(ret[i][1], y1); y2 = max(ret[i][3], y2); area += (ret[i][2] - ret[i][0]) * (ret[i][3] - ret[i][1]); if (s.find({ret[i][0], ret[i][1]}) == s.end()) s.insert({ret[i][0], ret[i][1]}); else s.erase({ret[i][0], ret[i][1]}); if (s.find({ret[i][2], ret[i][3]}) == s.end()) s.insert({ret[i][2], ret[i][3]}); else s.erase({ret[i][2], ret[i][3]}); if (s.find({ret[i][0], ret[i][3]}) == s.end()) s.insert({ret[i][0], ret[i][3]}); else s.erase({ret[i][0], ret[i][3]}); if (s.find({ret[i][2], ret[i][1]}) == s.end()) s.insert({ret[i][2], ret[i][1]}); else s.erase({ret[i][2], ret[i][1]}); } if (s.size() != 4 || !s.count({x1, y1}) || !s.count({x1, y2}) || !s.count({x2, y1}) || !s.count({x2, y2})) return false; return area == (x2 - x1) * (y2 - y1); } }; ``` ## 答案 ```cpp ``` ## 选项 ### A ```cpp ``` ### B ```cpp ``` ### C ```cpp ```