Find K Pairs with Smallest Sums

来源:互联网 发布:域名注册网站哪个好 编辑:程序博客网 时间:2024/06/03 16:29

You are given two integer arrays nums1 and nums2 sorted in ascending order and an integer k.

Define a pair (u,v) which consists of one element from the first array and one element from the second array.

Find the k pairs (u1,v1),(u2,v2) ...(uk,vk) with the smallest sums.

Example 1:

Given nums1 = [1,7,11], nums2 = [2,4,6],  k = 3Return: [1,2],[1,4],[1,6]The first 3 pairs are returned from the sequence:[1,2],[1,4],[1,6],[7,2],[7,4],[11,2],[7,6],[11,4],[11,6]

Example 2:

Given nums1 = [1,1,2], nums2 = [1,2,3],  k = 2Return: [1,1],[1,1]The first 2 pairs are returned from the sequence:[1,1],[1,1],[1,2],[2,1],[1,2],[2,2],[1,3],[1,3],[2,3]

Example 3:

Given nums1 = [1,2], nums2 = [3],  k = 3 Return: [1,3],[2,3]All possible pairs are returned from the sequence:[1,3],[2,3]
class Solution {public:    struct com{        bool operator()(pair<int,int>& a,pair<int,int>& b){            return a.first+a.second<b.first+b.second;        }    };    vector<pair<int, int>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k) {                priority_queue< pair<int,int>,vector<pair<int,int> >,com > 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();                                    }            }        }        vector<pair<int,int> >res(pq.size());        int i=0;        while(!pq.empty()){            res[i++]=pq.top();            pq.pop();        }        return res;    }};

上面用的是函数对象,下面用lamda表达式:
class Solution {public:    vector<pair<int, int>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k) {        auto com2=[](pair<int,int> a,pair<int,int> b ){return a.first+a.second<b.first+b.second; } ;        priority_queue< pair<int,int>,vector<pair<int,int> >,decltype(com2) > pq(com2);//最大堆        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();                                    }            }        }        vector<pair<int,int> >res(pq.size());        int i=0;        while(!pq.empty()){            res[i++]=pq.top();            pq.pop();        }        return res;    }};





0 0