原理如上图所示,最坏情况时间复杂度是k*klogk
参考了discuss的两份代码写了自己的代码
class Solution {
public:
class cell
{
public:
int first;
int second;
int third;
cell(int a, int b, int c) :first(a) , second(b) , third(c) {};
friend bool operator < (const cell & a, const cell & b)
{
return a.first + a.second > b.first + b.second;
};
};
vector<pair<int, int>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k)
{
vector<pair<int, int>> v;
if (nums1.empty() || nums2.empty()) return v;
priority_queue<cell> minHeap;
for (int i = 0; i < nums1.size() && i < k; i++) minHeap.emplace(cell{nums1[i],nums2[0],0});
while (minHeap.size() && k--)
{
auto t = minHeap.top();
minHeap.pop();
v.emplace_back(pair<int, int>(t.first, t.second));
if (t.third == nums2.size() - 1) continue;//nums2已经搜索完了,接下来就只能continue等待k--了
minHeap.emplace(cell {t.first, nums2[t.third + 1], t.third + 1});
}
return v;
}
};