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)
{
set<pair<long , long>> corners ;
long area = 0 ;
for(auto rec : rectangles)
{
pair<long , long> c1 = {rec[0] , rec[1]} , c2 = {rec[0] , rec[3]} , c3 = {rec[2] , rec[1]} , c4 = {rec[2] , rec[3]} ;
if(!corners.insert(c1).second) corners.erase(c1) ;
if(!corners.insert(c2).second) corners.erase(c2) ;
if(!corners.insert(c3).second) corners.erase(c3) ;
if(!corners.insert(c4).second) corners.erase(c4) ;
area += (rec[3] - rec[1]) * (rec[2] - rec[0]) ;
}
if(corners.size() != 4) return false ;
auto c1 = corners.begin() ;
auto c4 = corners.rbegin() ;
return area == ((*c4).second - (*c1).second) * ((*c4).first - (*c1).first) ;
}
};