设计一个算法,求出含n个元素的整数序列中最小的k个元素 ,以任意顺序返回这k个元素即可
时间: 2024-12-16 20:26:07 浏览: 10
可以使用优先队列(也称最小堆)来解决这个问题。优先队列是一种特殊的数据结构,其中每个元素都有一个优先级,总是按照优先级从高到低(对于最小堆就是从小到大)取出元素。以下是一个简单的C++实现:
```cpp
#include <queue>
#include <vector>
class Solution {
public:
std::vector<int> topKFrequent(vector<int>& nums, int k) {
std::priority_queue<std::pair<int, int>, std::vector<std::pair<int, int>>, greater<pair<int, int>>> pq;
// 初始化,将每个元素及其频率添加到堆中
unordered_map<int, int> freqMap;
for (int num : nums) {
freqMap[num]++;
pq.push({freqMap[num], num});
while (pq.size() > k) {
// 当堆的大小超过k时,移除最频繁但不在前k个的元素
freqMap[pq.top().second]--;
if (freqMap[pq.top().second] == 0)
pq.pop();
else
break;
}
}
// 构建最终答案,包含前k个最常见的元素
std::vector<int> answer;
while (!pq.empty()) {
answer.push_back(pq.top().second);
pq.pop();
}
return answer;
}
};
int main() {
Solution solution;
std::vector<int> nums = {1, 1, 1, 2, 2, 3}; // 示例输入
int k = 2; // 求解前k个最常见的元素
std::vector<int> result = solution.topKFrequent(nums, k);
for (int num : result) {
std::cout << num << " ";
}
return 0;
}
```
在这个算法中,我们遍历整个数组,计算每个元素的频率并将它们加入堆中。如果堆的大小大于k,我们就检查堆顶元素的频率,如果它的频率为0,则将其从堆中移除。这样保证了堆中始终是前k个最常见的元素。
阅读全文