int MOD = (int)1e9+7;
public int rectangleArea(int[][] rs) {
//将所有横坐标从小到大排序
List<Integer> list = new ArrayList<>();
for (int[] info : rs) {
list.add(info[0]); list.add(info[2]);
}
Collections.sort(list);
//遍历每个横向区间
long ans = 0;
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;
//获取覆盖该区间的方块的上下底区间,并从小到大排序
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];
});
//l,r为上一个连续区间的下界和上界,tot为总高度
long tot = 0, l = -1, r = -1;
for (int[] cur : lines) {
//与上个区间无交集
if (cur[0] > r) {
l = cur[0];
r = cur[1];
tot += r - l;
} else if (cur[1] > r) {//与上个区间有交集
tot+=cur[1]-r;//增加新的一部分高度
r = cur[1];
}
}
ans += tot * len;
ans %= MOD;
}
return (int) ans;
}
扫描线算法leetcode.850
最新推荐文章于 2023-02-19 21:07:55 发布