373. Find K Pairs with Smallest Sums

学习使用优先队列priority_queue的使用方式。priority_queue有三个参数供选择使用,第一个参数表示要盛放的元素种类,第二个参数是盛放的容器,第三个是元素之间的比较方式。参数二默认使用vector,参数三默认使用'<',故两者都缺省的话这个优先队列就是一个大顶堆。使用方式见下面的代码。
此题题意是在两个升序数组中找到前K小的数据对。
有一个关于priority_queue的小问题还没有解决,在下面的代码中,遇到更小的数对的时候需要更新堆中的内容,更新的时候push和pop谁先谁后的结果好像没有什么不同。

class Solution {
private:
    struct mycompare{
        bool operator()(pair& p1, pair& p2){
            return p1.first + p1.second < p2.first + p2.second;
        }
    };
public:
    vector> kSmallestPairs(vector& nums1, vector& nums2, int k) {
        vector> res;
        priority_queue, vector >, 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;
    }
};

你可能感兴趣的:(373. Find K Pairs with Smallest Sums)