Leetcode 373. 查找和最小的K对数字 解题思路及C++实现

心已入冬 提交于 2019-11-28 13:48:07

解题思路:

使用最大堆来存储k个和最小的数组组合,然后每进来一个数组组合,只需要和最大堆的堆顶进行比较即可。

用C++的priority_queue实现最大堆时,需要用一下pair来组合来自nums1和nums2数组的数,然后自己写一个比较结构体cmp,比较数组和的大小。

在循环中的一个trick在于,限制为访问nums1和nums2的前k个数即可。所以那一部分的时间复杂度为O(k*k)。

 

class Solution {
public:
    vector<vector<int>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k) {
        if(k == 0) return {{}};
        priority_queue<pair<int, int>, vector<pair<int, int>>, cmp> pq;   //最大堆
        for(int i = 0; i < nums1.size() && i < k; i++){
            for(int j = 0; j < nums2.size() && j < k; j++){
                pq.push(make_pair(nums1[i], nums2[j]));
                if(pq.size() > k) pq.pop();
            }
        }
        //将结果放到res中
        vector<vector<int> > res;
        while(!pq.empty()){
            vector<int> tmp;
            tmp.push_back(pq.top().first);
            tmp.push_back(pq.top().second);
            pq.pop();
            res.push_back(tmp);
        }
        return res;
    }
    
    //自定义比较结构体,比较和的大小
    struct cmp{
	    bool operator()(pair<int, int> a, pair<int, int> b){
		    if(a.first + a.second < b.first + b.second)	return true;
		    return false;
	    }
    };
};

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!