使用C++解决上面的题目呢?
时间: 2024-02-27 14:57:31 浏览: 124
当然可以!以下是使用 C++ 实现小根堆解决该问题的代码:
```cpp
#include <vector>
#include <queue>
using namespace std;
struct Pair {
int u, v, i;
Pair(int u, int v, int i) : u(u), v(v), i(i) {}
bool operator>(const Pair& other) const {
return u + v > other.u + other.v;
}
};
vector<vector<int>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k) {
priority_queue<Pair, vector<Pair>, greater<Pair>> heap;
for (int i = 0; i < nums1.size(); i++) {
heap.emplace(nums1[i], nums2[0], 0);
}
vector<vector<int>> result;
for (int i = 0; i < k && !heap.empty(); i++) {
auto [u, v, j] = heap.top(); heap.pop();
result.push_back({u, v});
if (j == nums2.size() - 1) continue;
heap.emplace(u, nums2[j + 1], j + 1);
}
return result;
}
```
这里我们定义了一个结构体 `Pair`,表示一对数对。它有三个成员变量:`u` 表示来自 `nums1` 的数,`v` 表示来自 `nums2` 的数,`i` 表示在 `nums2` 中下一个要考虑的数的下标。我们使用小根堆来维护当前和最小的前 `k` 个数对。堆中的每个元素都是一个 `Pair` 对象,按照 `u + v` 的值升序排列。
在函数内部,我们首先将 `nums1` 中的每个数与 `nums2` 中的第一个数组成一对,并将其加入小根堆中。然后,我们循环 `k` 次(或者直到堆为空),每次从堆中取出和最小的数对 `(u, v, j)`,将其加入结果列表 `result` 中,并将 `nums1` 中和 `u` 相邻的数和 `nums2` 中和 `v` 相邻的数组成的数对 `(nums1[i+1], nums2[j])` 加入堆中。最后,我们返回结果列表 `result`。
参考资料:
- LeetCode 题目 373. 查找和最小的 K 对数字
阅读全文