思路1
超時法:通過兩個循環記錄三元組[num1,num2,num1+num2]然后通過num1+num2從小到大進行排序,然后返回前K個對數中的前兩個數即可。
class Solution:def kSmallestPairs(self, nums1: List[int], nums2: List[int], k: int) -> List[List[int]]:if not nums1 or not nums2:return []res=[]for a in nums1:for b in nums2:res.append([a,b,a+b])res.sort(key=lambda x:(x[2]))tmp=[]for i in range(k):tmp.append([res[i][0],res[i][1]])return tmp
思路2
利用最小堆的方法,將 nums1 中前 k 個元素與 nums2[0] 組成的配對 (nums1[i] + nums2[0], i, 0) 壓入堆中,表示從 nums2 的第一個元素開始匹配。然后每次從堆中取出當前和最小的數對 (i, j),加入結果中,并將對應 nums2[j+1] 的新配對 (nums1[i], nums2[j+1]) 加入堆中,逐步擴展。該方法充分利用了兩個數組的有序性和堆結構,避免了暴力生成所有配對再排序,時間效率更高。
class Solution:def kSmallestPairs(self, nums1: List[int], nums2: List[int], k: int) -> List[List[int]]:if not nums1 or not nums2 or k==0:return []min_heap=[]res=[]for i in range(min(k,len(nums1))):#在nums1中選擇最小的k個和nums2匹配heapq.heappush(min_heap,(nums1[i]+nums2[0],i,0))while min_heap and len(res)<k:s,i,j=heapq.heappop(min_heap)res.append([nums1[i],nums2[j]])#nums2中繼續找if j+1<len(nums2):heapq.heappush(min_heap,(nums1[i]+nums2[j+1],i,j+1))return res