学习使用优先队列priority_queue的使用方式。priority_queue有三个参数供选择使用,第一个参数表示要盛放的元素种类,第二个参数是盛放的容器,第三个是元素之间的比较方式。参数二默认使用vector,参数三默认使用'<',故两者都缺省的话这个优先队列就是一个大顶堆。使用方式见下面的代码。
此题题意是在两个升序数组中找到前K小的数据对。
有一个关于priority_queue的小问题还没有解决,在下面的代码中,遇到更小的数对的时候需要更新堆中的内容,更新的时候push和pop谁先谁后的结果好像没有什么不同。
class Solution {
private:
struct mycompare{
bool operator()(pair<int, int>& p1, pair<int, int>& p2){
return p1.first + p1.second < p2.first + p2.second;
}
};
public:
vector<pair<int, int>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k) {
vector<pair<int, int>> res;
priority_queue<pair<int,int>, vector<pair<int, int> >, mycompare> pq;
for(int i = 0; i < min((int)nums1.size(), k); i++){
for(int j = 0; j < min((int)nums2.size(), k); j++){
if(pq.size() < k)
pq.push(make_pair(nums1[i], nums2[j]));
else if(nums1[i] + nums2[j] < pq.top().first + pq.top().second){
pq.push(make_pair(nums1[i], nums2[j]));
pq.pop();
}
}
}
while(!pq.empty()){
res.push_back(pq.top());
pq.pop();
}
return res;
}
};