给你一个数组 rectangles
,其中 rectangles[i] = [xi, yi, ai, bi]
表示一个坐标轴平行的矩形。这个矩形的左下顶点是 (xi, yi)
,右上顶点是 (ai, bi)
。
如果所有矩形一起精确覆盖了某个矩形区域,则返回 true
;否则,返回 false
。
提示:
1 <= rectangles.length <= 2 * 104
rectangles[i].length == 4
-105 <= xi, yi, ai, bi <= 105
思路:
如果是完美矩形,则所有矩形中最外面的四个坐标为该矩形的四个顶点,所有小矩形的面积和等于完美矩形的面积。对于剩余的点,一定会成对出现(四次或者两次),若超过四次则会重叠,奇数次则没有完全覆盖。
class Solution {
public boolean isRectangleCover(int[][] rectangles) {
记录大矩形的四个角的位置
int x = Integer.MAX_VALUE;
int y = Integer.MAX_VALUE;
int a = Integer.MIN_VALUE;
int b = Integer.MIN_VALUE;
int smallRecs = 0;
Set<String> set = new HashSet<>();
for(int[] r:rectangles){
x = Math.min(r[0],x);
y = Math.min(r[1],y);
a = Math.max(r[2],a);
b = Math.max(r[3],b);
smallRecs +=(r[2]-r[0])*(r[3]-r[1]);
String lt = r[0]+","+r[3];
String lb = r[0]+","+r[1];
String rt = r[2]+","+r[3];
String rb = r[2]+","+r[1];
if(set.contains(lt)) set.remove(lt);
else set.add(lt);
if(set.contains(lb)) set.remove(lb);
else set.add(lb);
if(set.contains(rt)) set.remove(rt);
else set.add(rt);
if(set.contains(rb)) set.remove(rb);
else set.add(rb);
}
if(set.size()==4&&set.contains(x+","+b)&&set.contains(x+","+y)
&&set.contains(a+","+b)&&set.contains(a+","+y)) return smallRecs==(a-x)*(b-y);
return false;
}
}