lc 632. Smallest Range
https://leetcode.com/problems/smallest-range/description/
给你k个数组,找一个最小区间[a,b],可以包含k个数组中的数字各至少一个。
滑动窗口题。
对于要求“最短”的题目很适用。
points:
1.在扩张右界的时候,一旦碰到合法就停止,但不用记录结果。在收缩左界的时候进行记录(判断)。
code:
import heapq class Solution: def __init__(self): self.a=None self.b=None def smallestRange(self, nums): """ :type nums: List[List[int]] :rtype: List[int] """ def newAns(a,b): if self.a==None or b-a<self.b-self.a: self.a=a self.b=b k=len(nums) cnt=[0]*k n=0 tem=[] for i in range(len(nums)): arr=nums[i] tem+=[(arr[j],i) for j in range(len(arr))] nums=tem nums.sort() i=0 j=-1 while j<len(nums): while j<len(nums) and n<k: j += 1 if j==len(nums): break cnt[nums[j][1]] += 1 if cnt[nums[j][1]] == 1: n += 1 while i<len(nums) and n==k: newAns(nums[i][0], nums[j][0]) cnt[nums[i][1]] -= 1 if cnt[nums[i][1]] == 0: n -= 1 i += 1 if i == len(nums): break return [self.a,self.b]