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]

 

posted @ 2018-09-13 11:46  Cloud.9  阅读(124)  评论(0编辑  收藏  举报