leetcode查找和最小的K对数字

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.指针

类似超级丑数那样

发布了191 篇原创文章 · 获赞 3 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_38196982/article/details/104824160