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.
分析
这一题还是很有难度的,如果不知道巧妙的解法的话,估计很难写出来答案。我反正也是想了半天没想出比较合适的解,最后还是看了别人的思路。
对于长方形的拼接,最终形成一个大的长方形,必然要求最后只剩下四个顶点,这四个顶点必然只能出现一次。在拼接的过程中顶点如果出现重合,那么也必然能断定重合的顶点出现了2次或4次,如果出现3次,那么这个顶点一定只能拼成270度,不可能成为一个长方形。
所以使用set记录只出现1次的顶点,当set出现重复时就erase掉,如果没有就insert,最终要求只能剩下4个顶点。
如果最终剩下4个顶点也不能证明是长方形,因为有可能会有下述情况。

那么也就要求最后剩余的四个点组成组成的矩形的面积也必须等于各个组成的矩形面积之和。
Code
class Solution {
public:
bool isRectangleCover(vector<vector<int>>& rectangles) {
int length = rectangles.size();
int area = 0;
set<pair<int, int>> s;
for (int i = 0; i < length; i ++)
{
vector<pair<int, int>> node;
node.push_back(make_pair(rectangles[i][0], rectangles[i][1]));
node.push_back(make_pair(rectangles[i][0], rectangles[i][3]));
node.push_back(make_pair(rectangles[i][2], rectangles[i][3]));
node.push_back(make_pair(rectangles[i][2], rectangles[i][1]));
for (int j = 0; j <4; j ++)
{
if (s.find(node[j]) != s.end())
{
s.erase(node[j]);
}
else
{
s.insert(node[j]);
}
}
area += (rectangles[i][2] - rectangles[i][0]) *
(rectangles[i][3] - rectangles[i][1]);
}
if (s.size() != 4)
return false;
int x1 = INT_MAX;
int x2 = INT_MIN;
int y1 = INT_MAX;
int y2 = INT_MIN;
set<pair<int, int>>::iterator iter;
for (iter = s.begin(); iter != s.end(); iter ++)
{
if (iter->first < x1)
x1 = iter->first;
if (iter->first > x2)
x2 = iter->first;
if (iter->second < y1)
y1 = iter->second;
if (iter->second > y2)
y2 = iter->second;
}
int rect = (y2 - y1) * (x2 - x1);
if (rect != area)
return false;
return true;
}
};
运行效率
Runtime: 176 ms, faster than 54.68% of C++ online submissions for Perfect Rectangle.
Memory Usage: 32.7 MB, less than 29.03% of C++ online submissions forPerfect Rectangle.
本文深入探讨了如何判断多个轴对齐的矩形是否能够完全覆盖一个更大的矩形区域的问题。通过分析顶点出现次数和总面积计算,提供了一种有效的解决方案,并附带C++代码实现,展示了算法的运行效率。
889

被折叠的 条评论
为什么被折叠?



