解题思路:
使用最大堆来存储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();
}
}
//将结果放到res中
vector<vector<int> > res;
while(!pq.empty()){
vector<int> tmp;
tmp.push_back(pq.top().first);
tmp.push_back(pq.top().second);
pq.pop();
res.push_back(tmp);
}
return res;
}
//自定义比较结构体,比较和的大小
struct cmp{
bool operator()(pair<int, int> a, pair<int, int> b){
if(a.first + a.second < b.first + b.second) return true;
return false;
}
};
};
来源:CSDN
作者:PaniniGu
链接:https://blog.csdn.net/gjh13/article/details/90273634