查找和最小的k对数字

leetcode!

给定两个以 非递减顺序排列 的整数数组 nums1nums2 , 以及一个整数 k 。定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2 。请找到和最小的 k 个数对 (u1, v1), (u2, v2) … (uk, vk)

示例 1:

输入: nums1 = [1,7,11], nums2 = [2, 4, 6], k = 3

输出: [1, 2], [1, 4], [1, 6]

解释: 返回序列中的前 3 对数:

[1, 2], [1, 4], [1, 6], [7, 2], [7, 4], [11, 2], [7, 6], [11, 4], [11, 6]

示例 2:

输入: nums1 = [1, 1, 2], nums2 = [1, 2, 3], k = 2

输出: [1, 1], [1, 1]

解释: 返回序列中的前 2 对数:

[1, 1], [1, 1], [1, 2], [2, 1], [1, 2], [2, 2], [1, 3], [1, 3], [2, 3]

代码实现如下:

#include <bits/stdc++.h>

using namespace std;

class Solution {
public:
    vector<vector<int>> KSmallestPairs(vector<int> &nums1, vector<int> &nums2, int k)
    {
        auto Com = [&nums1, &nums2](const pair<int, int> &a, const pair<int, int> &b) {
            return make_tuple(-nums1[a.first] - nums2[a.second]) <
                   make_tuple(-nums1[b.first] - nums2[b.second]);
        };
        priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(Com)> pq(Com);
        for (size_t i = 0; i < nums1.size(); i++) {
           pq.push({i, 0});
        }
        vector<vector<int>> res;
        while ((k--) && !pq.empty()) {
            auto [i, j] = pq.top();
            pq.pop();
            res.emplace_back(vector<int>({nums1[i], nums2[j]}));
            if (j + 1 < nums2.size()) {
                pq.push({i, j + 1});
            }
        }
        return res;
    }
};