850. Rectangle Area II

30 篇文章 0 订阅

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.

思路:二维转一维:扫描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]]))
            
        
        
        
                           
        


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值