📅  最后修改于: 2023-12-03 15:27:23.697000             🧑  作者: Mango
给定两个长度分别为 m
和 n
的整数数组 nums1
和 nums2
,以及一个整数 k
。定义一组值 (u,v)
,其中第一个元素来自 nums1
,第二个元素来自 nums2
。找到和最小的 k
个二元组 (u1,v1), (u2,v2)...(uk,vk)
,使得 (u1,v1)
, (u2,v2)
, ..., (uk,vk)
中任意两个元素之和都小于 (x,y)
中的元素之和。返回找到的二元组个数。
输入:nums1 = [1,7,11], nums2 = [2,4,6], k = 3, x = 10, y = 10
输出:2
解释:(1
, 2
), (1
, 4
) 是和最小的 2 个二元组,使得 (u1 + v1)
和 (u2 + v2)
小于 x
(10
),而且 (u1 + v1)
和 (u2 + v2)
小于 y
(10
)。
将 nums1
和 nums2
中元素两两组合,计算每个组合的和,得到一个新的有序数组 sorted_sum
。对 sorted_sum
进行从小到大排序,再用最小堆保存其中最小的前 k
个元素。最终得到的堆中的元素即为和最小的 k
个二元组,其和小于 (x,y)
。
具体实现细节可以参考以下代码:
以下是 Python 代码实现:
import heapq
def kSmallestPairs(nums1, nums2, k, x, y):
sorted_sum = []
for n1 in nums1:
for n2 in nums2:
if n1 + n2 > x or n1 + n2 > y:
break
heapq.heappush(sorted_sum, n1+n2)
if len(sorted_sum) > k:
heapq.heappop(sorted_sum)
return len(sorted_sum)
以上即为本题的解题思路和代码实现。