【每日一题】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]