【每日一題】632. 最小區間

xiaoxinlong發表於2024-11-24

你有 k 個 非遞減排列 的整數列表。找到一個 最小 區間,使得 k 個列表中的每個列表至少有一個數包含在其中。

我們定義如果 b-a < d-c 或者在 b-a == d-ca < 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]

相關文章