LeetCode_矩形_困难_391.完美矩形

x33g5p2x  于2022-04-22 转载在 其他  
字(2.1k)|赞(0)|评价(0)|浏览(328)

1.题目

给你一个数组 rectangles ,其中 rectangles[i] = [xi, yi, ai, bi] 表示一个坐标轴平行的矩形。这个矩形的左下顶点是 (xi, yi) ,右上顶点是 (ai, bi) 。

如果所有矩形一起精确覆盖了某个矩形区域,则返回 true;否则,返回 false 。

示例 1:

输入:rectangles = [[1,1,3,3],[3,1,4,2],[3,2,4,4],[1,3,2,4],[2,3,3,4]]
输出:true
解释:5 个矩形一起可以精确地覆盖一个矩形区域。

示例 2:

输入:rectangles = [[1,1,2,3],[1,3,2,4],[3,1,4,2],[3,2,4,4]]
输出:false
解释:两个矩形之间有间隔,无法覆盖成一个矩形。

示例 3:

输入:rectangles = [[1,1,3,3],[3,1,4,2],[1,3,2,4],[2,2,4,4]]
输出:false
解释:因为中间有相交区域,虽然形成了矩形,但不是精确覆盖。

提示:
1 <= rectangles.length <= 2 * 104
rectangles[i].length == 4
-105 <= xi, yi, ai, bi<= 105

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/perfect-rectangle

2.思路

(1)哈希表
思路见本题官方题解

3.代码实现(Java)

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

相关文章