文章目录
1. 题目
2. 思路
(1) HashMap
- 多个小矩形组成完美矩形的充分必要条件是:
- 所有小矩形的四个顶点中,只有完美矩形的四个顶点出现了1次,其他顶点均出现2次或者4次;
- 所有小矩形的面积之和等于完美矩形的面积。
- 利用HashMap存储所有小矩形的四个顶点及其出现的次数,根据组成完美矩形的充分必要条件判断其是否能组成完美矩形。
3. 代码
import java.util.*;
public class Test {
public static void main(String[] args) {
}
}
class Solution {
public boolean isRectangleCover(int[][] rectangles) {
Map<Coordinate, Integer> map = new HashMap<>();
int area = 0;
for (int[] rectangle : rectangles) {
Coordinate c1 = new Coordinate(rectangle[0], rectangle[1]);
Coordinate c2 = new Coordinate(rectangle[0], rectangle[3]);
Coordinate c3 = new Coordinate(rectangle[2], rectangle[1]);
Coordinate c4 = new Coordinate(rectangle[2], rectangle[3]);
map.put(c1, map.getOrDefault(c1, 0) + 1);
map.put(c2, map.getOrDefault(c2, 0) + 1);
map.put(c3, map.getOrDefault(c3, 0) + 1);
map.put(c4, map.getOrDefault(c4, 0) + 1);
area += ((rectangle[2] - rectangle[0]) * (rectangle[3] - rectangle[1]));
}
List<Coordinate> list = new ArrayList<>();
for (Map.Entry<Coordinate, Integer> entry : map.entrySet()) {
if (entry.getValue() == 2 || entry.getValue() == 4) {
continue;
}
if (entry.getValue() == 1 && list.size() < 4) {
list.add(entry.getKey());
} else {
return false;
}
}
if (list.size() != 4) {
return false;
}
int minX = Integer.MAX_VALUE;
int minY = Integer.MAX_VALUE;
int maxX = Integer.MIN_VALUE;
int maxY = Integer.MIN_VALUE;
for (Coordinate coordinate : list) {
minX = Math.min(minX, coordinate.x);
minY = Math.min(minY, coordinate.y);
maxX = Math.max(maxX, coordinate.x);
maxY = Math.max(maxY, coordinate.y);
}
return (maxX - minX) * (maxY - minY) == area;
}
}
class Coordinate {
public int x;
public int y;
public Coordinate(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Coordinate)) return false;
Coordinate that = (Coordinate) o;
return x == that.x && y == that.y;
}
@Override
public int hashCode() {
return Objects.hash(x, y);
}
@Override
public String toString() {
return "Coordinate{" +
"x=" + x +
", y=" + y +
'}';
}
}