391.完美矩形
链接:391.完美矩形
难度:Hard
标签:数组、扫描线
简介:如果所有矩形一起精确覆盖了某个矩形区域,则返回 true ;否则,返回 false 。
题解 1 - typescript
- 编辑时间:2021-11-16
- 执行用时:272ms
- 内存消耗:62.8MB
- 编程语言:typescript
- 解法介绍:计数判断面积和顶点重合次数。
function isRectangleCover(rectangles: number[][]): boolean {
/**
完美矩形要满足:
1. 最左上、左下、右上、右下四个顶点只出现1次;
2. 重合顶点重合次数必须为2、4,不能出现一次。
3. 大矩形面积等于小矩形面积之和。
*/
type Data = { cnt: number; point: number[] };
const set = new Set<string>();
const map: Record<string, Data> = {};
const format = (x: number, y: number) => `${x}:${y}`;
const map_add = (x: number, y: number) => {
const formatStr = format(x, y);
let data = map[formatStr];
if (!data) map[formatStr] = data = { cnt: 0, point: [x, y] };
data.cnt++;
};
let sum = 0;
const vertex: number[] = [];
const is_vertex = (x: number, y: number) =>
(x === vertex[0] && y === vertex[1]) ||
(x === vertex[2] && y === vertex[3]) ||
(x === vertex[0] && y === vertex[3]) ||
(x === vertex[2] && y === vertex[1]);
for (const [x, y, a, b] of rectangles) {
const formatStr = format(x, y) + ':' + format(a, b);
if (set.has(formatStr)) return false;
set.add(formatStr);
if (vertex[0] === undefined || vertex[0] > x || vertex[1] > y) {
vertex[0] = x;
vertex[1] = y;
}
if (vertex[2] === undefined || vertex[2] < a || vertex[3] < b) {
vertex[2] = a;
vertex[3] = b;
}
sum += (a - x) * (b - y);
map_add(x, y);
map_add(a, b);
map_add(x, b);
map_add(a, y);
}
if ((vertex[2] - vertex[0]) * (vertex[3] - vertex[1]) !== sum) return false;
for (const {
cnt,
point: [x, y],
} of Object.values(map)) {
if ((cnt === 1 && !is_vertex(x, y)) || (cnt !== 1 && cnt !== 2 && cnt !== 4)) {
return false;
}
}
return true;
}