题目:
850. Rectangle Area II
We are given a list of (axis-aligned) rectangles. Each rectangle[i] = [x1, y1, x2, y2] , where (x1, y1) are the coordinates of the bottom-left corner, and (x2, y2) are the coordinates of the top-right corner of the ith rectangle.
Find the total area covered by all rectangles in the plane. Since the answer may be too large, return it modulo 10^9 + 7.
Example 1:
Input: [[0,0,2,2],[1,0,2,3],[1,0,3,1]]
Output: 6
Explanation: As illustrated in the picture.
Example 2:
Input: [[0,0,1000000000,1000000000]]
Output: 49
Explanation: The answer is 10^18 modulo (10^9 + 7), which is (10^9)^2 = (-7)^2 = 49.
Note:
- 1 <= rectangles.length <= 200
- rectanges[i].length = 4
- 0 <= rectangles[i][j] <= 10^9
- The total area covered by all rectangles will never exceed 2^63 - 1 and thus will fit in a 64-bit signed integer.
850. 矩形面积 II
我们给出了一个(轴对齐的)矩形列表 rectangles 。 对于 rectangle[i] = [x1, y1, x2, y2],其中(x1,y1)是矩形 i 左下角的坐标,(x2,y2)是该矩形右上角的坐标。
找出平面中所有矩形叠加覆盖后的总面积。 由于答案可能太大,请返回它对 10 ^ 9 + 7 取模的结果。
示例 1:
输入:[[0,0,2,2],[1,0,2,3],[1,0,3,1]]
输出:6
解释:如图所示。
示例 2:
输入:[[0,0,1000000000,1000000000]]
输出:49
解释:答案是 10^18 对 (10^9 + 7) 取模的结果, 即 (10^9)^2 → (-7)^2 = 49 。
提示:
- 1 <= rectangles.length <= 200
- rectanges[i].length = 4
- 0 <= rectangles[i][j] <= 10^9
- 矩形叠加覆盖后的总面积不会超越 2^63 - 1 ,这意味着可以用一个 64 位有符号整数来保存面积结果。
思路:
按照x轴扫描,计算相应x范围内高度,计算面积求和
按照y轴扫描,计算相应y范围内宽度,计算面积求和
代码:
class Solution:
def rectangleArea(self, rectangles: List[List[int]]) -> int:
area = 0
rects = [item for x1, y1, x2, y2 in rectangles for item in [[x1, y1, y2, 0], [x2, y1, y2, 1]]]
last = rects[0][0]
heap = [(float('inf'), float('inf'))]
for x, y1, y2, k in sorted(rects):
h = start = end = 0
for m, n in heap:
if m > end:
h += end - start
start, end = m, n
else:
end = max(end, n)
area += (x-last)*h
import bisect
heap.remove((y1, y2)) if k else bisect.insort(heap, (y1, y2))
last = x
return area % (10**9 + 7)
def rectangleAreaV01(self, rectangles: List[List[int]]) -> int:
xs = sorted(set([x for x1, y1, x2, y2 in rectangles for x in [x1, x2]]))
count = [0]*len(xs)
xi = {v: i for i, v in enumerate(xs)}
L = []
for x1, y1, x2, y2 in rectangles:
L.append((y1, x1, x2, 1))
L.append((y2, x1, x2, -1))
L.sort()
cur_sum = 0
area = 0
cur_y = 0
for y, x1, x2, sig in L:
area += (y-cur_y)*cur_sum
cur_y = y
for i in range(xi[x1], xi[x2]):
count[i] += sig
cur_sum = sum(x2-x1 if c else 0 for x1, x2, c in zip(xs, xs[1:], count))
return area % (10 ** 9 + 7)