解题思路:
使用最大堆来存储k个和最小的数组组合,然后每进来一个数组组合,只需要和最大堆的堆顶进行比较即可。
用C++的priority_queue实现最大堆时,需要用一下pair来组合来自nums1和nums2数组的数,然后自己写一个比较结构体cmp,比较数组和的大小。
在循环中的一个trick在于,限制为访问nums1和nums2的前k个数即可。所以那一部分的时间复杂度为O(k*k)。
class Solution {
public:
vector<vector<int>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k) {
if(k == 0) return {
{}};
priority_queue<pair<int, int>, vector<pair<int, int>>, cmp> pq; //最大堆
for(int i = 0; i < nums1.size() && i < k; i++){
for(int j = 0; j < nums2.size() && j < k; j++){
pq.push(make_pair(nums1[i], nums2[j]));
if(pq.size() > k) pq.pop();
}