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 i
th 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.
思路:二维转一维:扫描y轴,遍历每个y范围,然后求出与改y范围有相交的x范围,merge这些x的interval
import heapq
class Solution:
def rectangleArea(self, a):
"""
:type rectangles: List[List[int]]
:rtype: int
"""
pqx,pqh=[],[]
for xmin,ymin,xmax,ymax in a:
pqx.append((xmin,ymax-ymin))
pqx.append((xmax,-ymax+ymin))
pqx.sort(key=lambda t:t[0])
preMax = 0
res = []
heapq.heappush(pqh, 0)
for x,h in pqx:
if h>0: heapq.heappush(pqh, -h)
else:
pqh.remove(h)
heapq.heapify(pqh)
if preMax!=-pqh[0]:
res.append((x,-pqh[0]))
preMax = -pqh[0]
res2 = 0
for i in range(len(res)-1):
res2+=res[i][1]*(res[i+1][0]-res[i][0])
return res2%1000000007
s=Solution()
print(s.rectangleArea([[0,0,2,2],[1,0,2,3],[1,0,3,1]]))
print(s.rectangleArea([[0,0,1000000000,1000000000]]))