本篇文章来总结一个比较有意思的题目!
我们需要从两个角度去判断
其一:求出左下角和右上角的顶点坐标,判断期望面积是否和实际面积相等。如果不相等,一定不是完美矩形;如果相等,也不一定是完美矩形
其二:根据最后有效顶点数,如果不等于 4,一定不是完美矩形;如果等于 4,也需要和一中求出的顶点匹配才满足完美矩阵
public boolean isRectangleCover(int[][] rectangles) {
// 左下角和右上角的顶点坐标
int minX = 100010, minY = 100010;
int maxX = -100010, maxY = -100010;
int actualArea = 0;
Set<String> set = new HashSet<>();
for (int[] rect : rectangles) {
int x = rect[0], y = rect[1], a = rect[2], b = rect[3];
minX = Math.min(minX, x);
minY = Math.min(minY, y);
maxX = Math.max(maxX, a);
maxY = Math.max(maxY, b);
// 期望面积
actualArea += (a - x) * (b - y);
// 计算有效顶点数
int[][] points = new int[][]{ {x, y}, {x , b}, {a, y}, {a, b} };
for (int[] p : points) {
String s = p[0] + "," + p[1];
if (set.contains(s)) set.remove(s);
else set.add(s);
}
}
// 期望面积和实际面积不相等
if (actualArea != (maxX - minX) * (maxY - minY)) return false;
// 有效顶点数不等于 4
if (set.size() != 4) return false;
int[][] points = new int[][]{ {minX, minY}, {minX , maxY}, {maxX, minY}, {maxX, maxY} };
for (int[] p : points) {
String s = p[0] + "," + p[1];
// 有效顶点和一中求出的顶点不匹配
if (!set.contains(s)) return false;
}
return true;
}