题目链接:包含每个查询的最小区间
思路:
考虑对每个给定的区间根据区间长度排序,根据区间长度从小到大的顺序对每个区间染色(已经染色过的区间将其删除不再进行处理),从而转化为一个区间染色和区间删除的问题,可使用并查集来维护。
代码:
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