0850:矩形面积 II(2235 分)
目录
题目
给你一个轴对齐的二维数组 rectangles
。 对于 rectangle[i] = [x1, y1, x2, y2]
,其中(x1,y1)是矩形 i
左下角的坐标, (xi1, yi1)
是该矩形 左下角 的坐标, (xi2, yi2)
是该矩形 右上角 的坐标。
计算平面中所有 rectangles
所覆盖的 总面积 。任何被两个或多个矩形覆盖的区域应只计算 一次 。
返回 总面积 。因为答案可能太大,返回 109 + 7
的 模 。
示例 1:
输入:rectangles = [[0,0,2,2],[1,0,2,3],[1,0,3,1]] 输出:6 解释:如图所示,三个矩形覆盖了总面积为 6 的区域。 从(1,1)到(2,2),绿色矩形和红色矩形重叠。 从(1,0)到(2,3),三个矩形都重叠。
示例 2:
输入:rectangles = [[0,0,1000000000,1000000000]] 输出:49 解释:答案是 1018 对 (109 + 7) 取模的结果, 即 49 。
提示:
1 <= rectangles.length <= 200
rectanges[i].length = 4
0 <= xi1, yi1, xi2, yi2 <= 109
分析
#1
- 类似 0218,不过遍历坐标 x 时,要维护的不是高度集合,而是区间集合
- 每一轮根据当前横坐标 x 、上一轮横坐标 pre,上一轮区间集合覆盖的长度 w,即可计算出 pre 到 x 的面积
|
|
时间复杂度 O(N^2),15 ms
#2
- 还可以用线段树维护区间覆盖的长度 w
- 直接维护覆盖的长度不好处理,一种方法是维护"区间的最小值" t 和 t 对应的长度 sz
- 那么假如总区间的最小值 t>0,说明整个区间都被覆盖
- 否则 t=0,那么覆盖的长度为总区间长度 s - (t 对应的 sz)
|
|
19 ms
#3
- 还有种特殊的写法
- 本题的线段树有两个特殊性
- 只查询根节点
- 只删除之前添加过的区间
- 所以可以不用下传懒标记
解答
|
|
11 ms