📜  第 K 个最小的对和小于给定对 (x, y) 的对数(1)

📅  最后修改于: 2023-12-03 15:27:23.697000             🧑  作者: Mango

第 K 个最小的对和小于给定对 (x, y) 的对数

问题描述

给定两个长度分别为 mn 的整数数组 nums1nums2,以及一个整数 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)。

解题思路

nums1nums2 中元素两两组合,计算每个组合的和,得到一个新的有序数组 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)

以上即为本题的解题思路和代码实现。