1.堆
第K小,前K小用大顶堆,第K大,前K大用小顶堆。
使用最大堆,堆中保存前k个和最小的元素对,且堆顶元素最大,当新的元素对大于堆顶元素时,则将新的元素入队,删除堆顶元素。
因为是元素堆,则需要自定义排序。
代码如下:
class Solution {
public:
struct cmp{
bool operator ()(pair<int, int> &a, pair<int, int> &b) {
return a.first+a.second<b.first+b.second;
}
};//自定义排序
vector<vector<int>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k) {
priority_queue<pair<int,int>,vector<pair<int,int>>,cmp>q;
vector<vector<int>>res;
for(int i=0;i<nums1.size();i++){
for(int j=0;j<nums2.size();j++){
if(q.size()<k)
q.push({nums1[i],nums2[j]});
else if(nums1[i]+nums2[j]<q.top().first+q.top().second){//最大堆
q.pop();
q.push({nums1[i],nums2[j]});
}
}
}
while(!q.empty()){
pair<int,int> top=q.top();
res.push_back({top.first,top.second});
q.pop();
}
reverse(res.begin(),res.end());
return res;
}
};
2.指针
类似超级丑数那样