题目:
分析:
看完题就感觉做过,
但是还是没想出来,
看到求前k个的最值,那么一般都是用到了堆。
洛谷上的方法:
‘
差点走入一个误区,注意,各行是没有重复的。
这么长时间:vector s = { t.first,t.second.first };这都不知道!!!
代码:
class Solution {
public:
struct cmp {
bool operator() (const pair<int, pair<int, int> >& a, const pair<int, pair<int, int> >& b) {
return a.first + a.second.first > b.first + b.second.first;
}
};
vector<vector<int>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k) {
int len1=nums1.size();
int len2=nums2.size();
k = min(k,len1*len2);
vector<vector<int> > vv;
if(k==0) return vv;
priority_queue <pair<int,pair<int,int> >,vector<pair<int, pair<int, int> > >, cmp > q;
for (int i = 0; i < nums1.size(); i++) {
pair<int, pair<int, int> > t(nums1[i], pair<int, int>(nums2[0] , 0));
q.push(t);
}
for(int i=0;i<k;i++)
{
pair<int, pair<int, int> > pp = q.top();
q.pop();
vector<int> s = { pp.first,pp.second.first };
vv.push_back(s);
if(pp.second.second<nums2.size()-1)
{
pp.second.second++;
pp.second.first=nums2[pp.second.second];
q.push(pp);
}
}
return vv;
}
};