区间操作的python3板子 LeetCode 715. Range 模块

10 篇文章 0 订阅
6 篇文章 1 订阅

注意事项:

区间都是左闭又开[x,y)

from sortedcontainers import SortedList
class RangeModule:
    def __init__(self):
        self.rl=SortedList()
        self.count=0
    def addRange(self, left: int, right: int) -> None:  #[left,right)
        right-=1
        n,i=len(self.rl),self.rl.bisect_left((left-1,-1))
        cur_l,cur_r=left,right
        while i<n:
            r,l=self.rl[i]
            if l>right+1:break
            cur_l,cur_r=min(cur_l,l),max(cur_r,r)
            self.count-=r-l+1
            self.rl.pop(i)
            n-=1
        self.rl.add((cur_r,cur_l))
        self.count+=cur_r-cur_l+1
    def getCount(self,left: int, right: int):  #[left,right)
        right-=1
        i,cnt,n=self.rl.bisect_left((left,-1)),0,len(self.rl)
        while i<n:
            r,l=self.rl[i]
            if l>right :break
            cnt+=min(r,right)-max(l,left)+1
            i+=1
        return cnt
    def getAllCount(self):return self.count
    def queryRange(self, left: int, right: int) -> bool:   #[left,right)
        return self.getCount(left,right)==right-left
    def removeRange(self, left: int, right: int) -> None:  #[left,right)
        need_delete,need_add=[],[]
        right-=1
        i,n=self.rl.bisect_left((left,-1)),len(self.rl)
        while i<n:
            r,l=self.rl[i]
            if l>right :break
            com_l,com_r=max(l,left),min(r,right)
            need_delete.append((r,l))
            if com_l!=left :
                need_add.append((r,com_r+1))
            elif com_r!=right:
                need_add.append((com_l-1,l))
                left=com_r+1
            else:
                if l<=left-1:need_add.append((left-1,l))
                if right+1<=r:need_add.append((r,right+1))
                break
            i+=1
        for item in need_delete:
            self.rl.discard(item)
            self.count-=item[0]-item[1]+1
        for item in need_add:
            self.rl.add(item)
            self.count+=item[0]-item[1]+1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值