在一组数字中找到重复次数最大的前10个数字并进行打印
解题思路:
- 首先统计所有数字的重复次数(需要无序哈希表)
- 由于要记录数字和重复的次数,,所以需要打包一个类类型
在map中找val
第一种形式
unordered_map<int ,int> numMap;//定义无序的映射哈希表
for (int val : vec)
{
auto it = numMap.find(val);
if (it == numMap.end())
{
// 没找到,添加[val, 1]
numMap.insert(make_pair(val, 1));
}
else
{
// 找到了,给值加1 first second
it->second++;
}
第二种形式
拿val数字在map中查找,如果val不存在,numMap[val]会插入一个[val,0]
返回值,然后++,得到一个[val,1]这么一组新数据,如果val存在,numMap[val]刚好返回的是val数字对应的second重复的次数。
unordered_map<int ,int> numMap;//定义无序的映射哈希表
for (int val : vec)
{
numMap[val]++;
}
因为要记录数字和重复的次数,所以需要打包一个类类型
struct Node
{
Node(int v, int c) :val(v), count(c) {}
// 为什么要实现operator>,因为小根堆里面要比较Node对象的大小
// greater > less <
bool operator>(const Node &src)const
{
return count > src.count;
}
int val; // 表示数字的值
int count; // 表示数字重复的次数
};
求topk 大
- 先定义一个小根堆
priority_queue<Node, vector<Node>, greater<Node>> minheap;
int k = 0;
auto it = numMap.begin();
// 先从map表中读10个数据到小根堆中,建立top 10的小根堆,最小的元素在堆顶
for (; it != numMap.end() && k < 10; ++it, ++k)
{
minheap.push(Node(it->first, it->second));
}
// 把K+1到末尾的元素进行遍历,和堆顶元素比较
for (; it != numMap.end(); ++it)
{
// 如果map表中(当前元素重复次数>堆顶元素的重复次数),则替换
if (it->second > minheap.top().count)
{
minheap.pop();
minheap.push(Node(it->first, it->second));
}
}
堆中剩下的就是重复次数最大的前10个
while (!minheap.empty())
{
Node node = minheap.top();
cout << node.val << " : " << node.count << endl;
minheap.pop();
}