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<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;
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容