📅  最后修改于: 2023-12-03 15:23:28.633000             🧑  作者: Mango
该程序可以在两个数组中找到具有最小和的k对数字,并返回这些数字的列表。这个问题可以理解为在两个集合中找到最近的k个点对(每个点有两个维度)并计算它们之间的距离,我们采用了堆(Heap)的数据结构来解决该问题。
该程序的时间复杂度为 O(klogk)
,空间复杂度为 O(k)
,其中 k
为找到的数字对的数量。
import heapq
from typing import List, Tuple
def kSmallestPairs(nums1: List[int], nums2: List[int], k: int) -> List[Tuple[int, int]]:
if not nums1 or not nums2 or not k:
return []
# 创建一个最小堆
heap = []
# 将第一个数组的前K个元素与第二个数组的第一个元素组成一个元组,
# 并将该元组和第一个数组索引作为堆的元素。
for i, num1 in enumerate(nums1[:k]):
heapq.heappush(heap, (num1 + nums2[0], i, 0))
# 输出堆中前K个元素
res = []
while heap and len(res) < k:
_, i, j = heapq.heappop(heap)
res.append((nums1[i], nums2[j]))
# 如果该元素来自第一个数组,则将该元素与第二个数组中下一个元素组成一个元组,
# 并将该元组和第一个数组索引作为堆的元素,堆的元素按元组和进行排序。
if j < len(nums2) - 1:
heapq.heappush(heap, (nums1[i] + nums2[j + 1], i, j + 1))
return res
nums1 = [1,7,11]
nums2 = [2,4,6]
k = 3
print(kSmallestPairs(nums1, nums2, k))
# Output: [(1, 2), (1, 4), (1, 6)]
该程序是一个典型的堆(Heap)的应用,堆可以帮助我们在大量的数据中,快速地找到最大或最小的数字或元素。掌握堆的应用,可以在解决类似的问题时,提高程序的效率。