题目:输入n个整数,找出其中最小的k个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4.
思路2:用最大堆。
#include<iostream>
#include<cstdio>
#include <set>
#include <vector>
#include <functional>
using namespace std;
typedef multiset<int, greater<int>> intSet;
typedef multiset<int, greater<int>>::iterator setIterator;
void GetLeastNumbers(const vector<int>& data, intSet& leastNumbers, int k)
{
leastNumbers.clear();
if (k < 1 || data.size() < k)
{
return;
}
vector<int>::const_iteratoe iter = data.begin();
for (; iter != data.end() iter++)
{
if (leastNumbers.size() < k)
{
leastNumbers.insert(*iter);
}
else
{
setIterator iterGreatest = leastNumbers.begin();
if (*iter < *(leastNumbers.begin()))
{
leastNumbers.erase(iterGreatest);
leastNumbers.insert(*iter);
}
}
}
}
int main()
{
}
本文介绍了一种利用最大堆(通过 C++ STL 中的 multiset 实现)寻找一组整数中最小 k 个数的方法。该方法首先清理最大堆,然后遍历输入的整数集合,将每个元素插入堆中直到堆的大小等于 k。当堆已满时,如果新元素小于堆顶元素,则移除堆顶元素并插入新元素。此算法确保堆始终包含最小的 k 个数。


被折叠的 条评论
为什么被折叠?



