我们给出了一个(轴对齐的)二维矩形列表 rectangles 。 对于 rectangle[i] = [x1, y1, x2, y2],其中(x1,y1)是矩形 i 左下角的坐标, (xi1, yi1) 是该矩形 左下角 的坐标, (xi2, yi2) 是该矩形 右上角 的坐标。

计算平面中所有 rectangles 所覆盖的 总面积 。任何被两个或多个矩形覆盖的区域应只计算 一次 。

返回 总面积 。因为答案可能太大,返回 109 + 7 的 模 。

 

 

 

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/rectangle-area-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

做题经历:

看到这题最初的想法是暴力搜索,即检查每一个格子,检验其是否在某个矩形中,将格子的个数加起来即得到了面积,算法的时间复杂度大概在O(N立方),本题数据范围较大,感觉一定会time limited,因此直接放弃。然后因为本人很菜,没有想到什么好的方法,于是查看了题解。

题解1:

class Solution {
int MOD = (int)1e9+7; //取模
public int rectangleArea(int[][] rs) {
List<Integer> list = new ArrayList<>(); 定义一个存储横坐标的list
for (int[] info : rs) {
list.add(info[0]); list.add(info[2]); 存储每个矩形的横坐标
}
Collections.sort(list); 对横坐标排序
long ans = 0; 用long型定义结果
for (int i = 1; i < list.size(); i++) { 开始计算每两个相邻坐标之间的矩形面积
int a = list.get(i - 1), b = list.get(i), len = b - a;  计算区间宽度
if (len == 0) continue; 如果宽度为0,则继续
List<int[]> lines = new ArrayList<>(); 保存横坐标覆盖该范围的所有矩形的纵坐标范围
for (int[] info : rs) {
if (info[0] <= a && b <= info[2]) lines.add(new int[]{info[1], info[3]}); 添加每个符合条件的矩形的纵坐标
}
Collections.sort(lines, (l1, l2)->{
return l1[0] != l2[0] ? l1[0] - l2[0] : l1[1] - l2[1];  对这些纵坐标范围进行排序,第一个最小的排在最先,第一个相同的按照第二个进行排序
});
long tot = 0, l = -1, r = -1; tot为线段并集长度,l为上一个考虑的矩形纵坐标范围的最小值,r为上一个考虑的矩形纵坐标范围的最大值
for (int[] cur : lines) {
if (cur[0] > r) { 如果比上一个最大值还要大,需要把上一个计算的整段都加上
tot += r - l;
l = cur[0]; r = cur[1];
} else if (cur[1] > r) { 如果该最大值比上一个最大值大,但最小值在其范围里,则更新上一个的最大值
r = cur[1];
}
}
tot += r - l; 加上最后一个未计算的纵坐标区间
ans += tot * len; 加上该区间面积
ans %= MOD; 取模
}
return (int) ans;
}
}

作者:AC_OIer
链接:https://leetcode.cn/problems/rectangle-area-ii/solution/gong-shui-san-xie-by-ac_oier-9r36/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

该题解相当于将矩形面积离散化,分成一段段矩形进行考虑,想法比较简单一些,代码时间复杂度稍微高一点,但易于理解,leetcode的官方解法作者还在努力理解中。以上注释为作者对宫水三叶题解的自我理解。

posted on 2022-09-17 20:11  JohnWangzx  阅读(29)  评论(0编辑  收藏  举报