# 堆一直保存k个数(每个list仅保留一个), 最小的pop后, 相应的list往右移一位, 记录移动过程中heap中最小的范围
class Solution:
def smallestRange(self, nums: List[List[int]]) -> List[int]:
heap = [(row[0], i, 0) for i, row in enumerate(nums)]
heapq.heapify(heap)
max_value = max([row[0] for row in heap])
min_value = min([row[0] for row in heap])
ans = [min_value, max_value]
while len(heap) == len(nums):
num, r, c = heapq.heappop(heap)
if c + 1 < len(nums[r]):
heapq.heappush(heap, (nums[r][c + 1], r, c + 1))
max_value = max(max_value, nums[r][c + 1])
min_value = heapq.nsmallest(1, heap)[0][0]
if max_value - min_value < ans[1] - ans[0]:
ans = [min_value, max_value]
return ans