【每日一题】632. 最小区间

你有 k 个 非递减排列 的整数列表。找到一个 最小 区间,使得 k 个列表中的每个列表至少有一个数包含在其中。

我们定义如果 b-a < d-c 或者在 b-a == d-c 时 a < c,则区间 [a,b] 比 [c,d] 小。

 

示例 1:

输入:nums = [[4,10,15,24,26], [0,9,12,20], [5,18,22,30]]
输出:[20,24]
解释: 
列表 1:[4, 10, 15, 24, 26],24 在区间 [20,24] 中。
列表 2:[0, 9, 12, 20],20 在区间 [20,24] 中。
列表 3:[5, 18, 22, 30],22 在区间 [20,24] 中。

示例 2:

输入:nums = [[1,2,3],[1,2,3],[1,2,3]]
输出:[1,1]

 

 

class Solution:
    def smallestRange(self, nums: List[List[int]]) -> List[int]:
        pairs = sorted((x,i) for (i,att) in enumerate(nums) for x in att)
        
        ans_l = -inf
        ans_r = inf

        empty = len(nums)
        cnt = [0]*empty
        left = 0

        #  滑动窗口先找到一个满足所有列都存在的
        #  然后缩小窗口,左端点移动
        #  每次铆钉右端点,然后看最近的左端点
        for r,i in pairs:
            if cnt[i] == 0:
                empty -= 1
            cnt[i] += 1
            while empty==0:
                l,i = pairs[left]
                if r-l < ans_r-ans_l:
                    ans_l,ans_r=l,r
                cnt[i] -= 1
                if cnt[i] == 0:
                    empty += 1
                left += 1
        return [ans_l,ans_r]

 

posted @ 2024-11-24 03:46  xiaoxinlong  阅读(3)  评论(0编辑  收藏  举报