题目:
代码(首刷看解析 2024年3月31日):
自解的方法超时,这题时间复杂度不能>= O(n^2)
class Solution {
public:
vector<vector<int>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k) {
vector<vector<int>> res;
// 元组,第一个参数用来存放num1[i] + num2[j]的相反数,从而实现大根堆模拟小根堆
priority_queue<tuple<int,int,int>> pq;
int m = nums1.size(), n = nums2.size();
// 只存放 k m的最小值的pq,优化空间复杂度
for (int i = 0; i < min(k, m); ++i) {
pq.emplace(-nums1[i]-nums2[0], i, 0);
}
while (!pq.empty() && res.size() < k) {
//C++ 17新语法:结构化绑定,通过unpack的方式直接获得tuple中多个变量
//其中第一个元素是用来priority_queue内部排序后文用不到,用_占位
auto [_, i, j] = pq.top();
pq.pop();
res.push_back({nums1[i], nums2[j]});
// 因为nums1和nums2有序,插入j + 1后,可以重排最小值
if (j + 1 < n)
pq.emplace(-nums1[i]-nums2[j + 1], i, j + 1);
}
return res;
}
};