本篇文章来总结一个比较有意思的题目!
我们需要从两个角度去判断
其一:求出左下角和右上角的顶点坐标,判断期望面积是否和实际面积相等。如果不相等,一定不是完美矩形;如果相等,也不一定是完美矩形
其二:根据最后有效顶点数,如果不等于 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;}