[LeetCode] 包含每个查询的最小区间 并查集+贪心+思维

题目链接:包含每个查询的最小区间

思路:

考虑对每个给定的区间根据区间长度排序,根据区间长度从小到大的顺序对每个区间染色(已经染色过的区间将其删除不再进行处理),从而转化为一个区间染色和区间删除的问题,可使用并查集来维护。

代码:

class Solution:
    def minInterval(self, buf: List[List[int]], q: List[int]) -> List[int]:
        s=set()
        for l,r in buf:
            s.add(l)
            s.add(r)
        for x in q:
            s.add(x)
        s=list(s)
        s.sort()
        pre=[i for i in range(len(s)+1)]
        w=[-1 for i in range(len(s)+1)]
        def find(x):
            temp=x
            while temp!=pre[temp]:
                temp=pre[temp]
            i=x
            while i!=temp:
                j=pre[i]
                pre[i]=temp
                i=j
            return temp
        buf.sort(key=lambda x:x[1]-x[0]+1)
        for l,r in buf:
            length=r-l+1
            l=bisect.bisect(s,l)-1
            r=bisect.bisect(s,r)-1
            while find(l)<=r:
                l=find(l)
                pre[l]=l+1
                w[l]=length
        ans=[]
        for x in q:
            ans.append(w[bisect.bisect(s,x)-1])
        return ans

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值