目录
对于多个有序数组取 top k 的问题,一个常见的思路是使用最小堆(min heap)来处理。
#include <iostream>
#include <vector>
#include <queue>
std::vector<int> findTopK(const std::vector<std::vector<int>>& arrays, int k) {
struct ArrayElement {
int value; // 元素的值
int arrayIndex; // 所属数组的索引
int elementIndex; // 元素在所属数组中的索引
ArrayElement(int v, int ai, int ei) : value(v), arrayIndex(ai), elementIndex(ei) {}
};
auto compare = [](const ArrayElement& a, const ArrayElement& b) { return a.value > b.value; };
std::priority_queue<ArrayElement, std::vector<ArrayElement>, decltype(compare)> minHeap(compare);
// 初始化最小堆,将每个数组的第一个元素加入堆中
for (int i = 0; i < arrays.size(); ++i) {
if (!arrays[i].empty()) {
minHeap.emplace(arrays[i][0], i, 0);
}
}
std::vector<int> result;
while (!minHeap.empty() && result.size() < k) {
ArrayElement top = minHeap.top();
minHeap.pop();
result.push_back(top.value);
// 将当前元素所属数组的下一个元素加入堆中
if (top.elementIndex + 1 < arrays[top.arrayIndex].size()) {
minHeap.emplace(arrays[top.arrayIndex][top.elementIndex + 1], top.arrayIndex, top.elementIndex + 1);
}
}
return result;
}
int main() {
std::vector<std::vector<int>> arrays = {{1, 4, 7}, {2, 5, 8}, {3, 6, 9}};
int k = 5;
std::vector<int> topK = findTopK(arrays, k);
std::cout << "The top " << k << " elements are: ";
for (int num : topK) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
在上述示例中,我们定义了一个 ArrayElement 结构体来表示每个数组的元素,包括元素的值、所属数组的索引和元素在所属数组中的索引。
findTopK 函数使用最小堆来处理取 top k 的逻辑。首先,我们将每个数组的第一个元素加入最小堆中。然后,从堆中依次取出最小的元素,并将其添加到结果集中。同时,我们还将当前元素所属数组的下一个元素加入最小堆中。重复这个过程,直到取出 k 个元素或者堆为空。
运行上述代码,将输出多个有序数组中的前 k 个最小元素。你可以根据自己的需求调整输入的数组和 k 值进行测试。
No comments yet.