你有 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]