问题描述
思路分析及代码实现
方法一 一行代码
调用itertools模块中的product
一行代码实现
class Solution:
def kSmallestPairs(self, nums1: List[int], nums2: List[int], k: int) -> List[List[int]]:
return sorted(itertools.product(nums1,nums2),key=sum)[:k]
非常开心写出了一行代码,遗憾地是超时了,阿巴阿巴
方法二 优先队列
大体思路还是很清晰的,因为给定的两组数据都是升序排列的,这样可以先在nums1的前 k 或 m 项中,生成与 nums2[0] 对应组合的队列,利用堆的特性找出最小值,然后逐渐增加 j 的下标,将找到的组合push入队列中,循环找出堆的最小值所对应的组合即可
class Solution:
def kSmallestPairs(self, nums1: List[int], nums2: List[int], k: int) -> List[List[int]]:
m, n = len(nums1), len(nums2)
ans = []
pq = [(nums1[i] + nums2[0], i, 0) for i in range(min(k, m))]
while pq and len(ans) < k:
_, i, j = heappop(pq)
ans.append([nums1[i], nums2[j]])
if j + 1 < n:
heappush(pq, (nums1[i] + nums2[j+1], i , j+1))
return ans