题目

类型:Array

image.png
image.png

解题思路

精确覆盖意味着:

  • 矩形区域中不能有空缺,即矩形区域的面积等于所有矩形的面积之和;
  • 矩形区域中不能有相交区域。

需要一个统计量来判定是否存在相交区域。由于精确覆盖意味着矩形的边和顶点会重合在一起,不妨统计每个矩形顶点的出现次数。同一个位置至多只能存在四个顶点,在满足该条件的前提下,如果矩形区域中有相交区域,这要么导致矩形区域四角的顶点出现不止一次,要么导致非四角的顶点存在出现一次或三次的顶点;
因此要满足精确覆盖,除了要满足矩形区域的面积等于所有矩形的面积之和,还要满足矩形区域四角的顶点只能出现一次,且其余顶点的出现次数只能是两次或四次。
在代码实现时,可以遍历矩形数组,计算矩形区域四个顶点的位置,以及矩形面积之和,并用哈希表统计每个矩形的顶点的出现次数。遍历完成后,检查矩形区域的面积是否等于所有矩形的面积之和,以及每个顶点的出现次数是否满足上述要求。

代码

  1. class Solution {
  2. public boolean isRectangleCover(int[][] rectangles) {
  3. long area = 0;
  4. int minX = rectangles[0][0], minY = rectangles[0][1], maxX = rectangles[0][2], maxY = rectangles[0][3];
  5. Map<Point, Integer> cnt = new HashMap<Point, Integer>();
  6. for (int[] rect : rectangles) {
  7. int x = rect[0], y = rect[1], a = rect[2], b = rect[3];
  8. area += (long) (a - x) * (b - y);
  9. minX = Math.min(minX, x);
  10. minY = Math.min(minY, y);
  11. maxX = Math.max(maxX, a);
  12. maxY = Math.max(maxY, b);
  13. Point point1 = new Point(x, y);
  14. Point point2 = new Point(x, b);
  15. Point point3 = new Point(a, y);
  16. Point point4 = new Point(a, b);
  17. cnt.put(point1, cnt.getOrDefault(point1, 0) + 1);
  18. cnt.put(point2, cnt.getOrDefault(point2, 0) + 1);
  19. cnt.put(point3, cnt.getOrDefault(point3, 0) + 1);
  20. cnt.put(point4, cnt.getOrDefault(point4, 0) + 1);
  21. }
  22. Point pointMinMin = new Point(minX, minY);
  23. Point pointMinMax = new Point(minX, maxY);
  24. Point pointMaxMin = new Point(maxX, minY);
  25. Point pointMaxMax = new Point(maxX, maxY);
  26. if (area != (long) (maxX - minX) * (maxY - minY) || cnt.getOrDefault(pointMinMin, 0) != 1 || cnt.getOrDefault(pointMinMax, 0) != 1 || cnt.getOrDefault(pointMaxMin, 0) != 1 || cnt.getOrDefault(pointMaxMax, 0) != 1) {
  27. return false;
  28. }
  29. cnt.remove(pointMinMin);
  30. cnt.remove(pointMinMax);
  31. cnt.remove(pointMaxMin);
  32. cnt.remove(pointMaxMax);
  33. for (Map.Entry<Point, Integer> entry : cnt.entrySet()) {
  34. int value = entry.getValue();
  35. if (value != 2 && value != 4) {
  36. return false;
  37. }
  38. }
  39. return true;
  40. }
  41. }
  42. class Point {
  43. int x;
  44. int y;
  45. public Point(int x, int y) {
  46. this.x = x;
  47. this.y = y;
  48. }
  49. @Override
  50. public int hashCode() {
  51. return x + y;
  52. }
  53. @Override
  54. public boolean equals(Object obj) {
  55. if (obj instanceof Point) {
  56. Point point2 = (Point) obj;
  57. return this.x == point2.x && this.y == point2.y;
  58. }
  59. return false;
  60. }
  61. }