N个数中的前k个

题目描述:n个数,打印出重复次数最多的前十个
方法:无序容器+优先级队列
数据结构:哈希单重映射表+优先级队列
步骤:
1、遍历所有的数,放进哈希表中
2、找到前十个重复率最高的
3、打印

#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
#include<functional>
#include<unordered_map>
using namespace std;
//自定义结构体
struct Node
{
	Node(int v,int c):val(v),count(c){}
	bool operator>(const Node& src)const
	{
		return count>src.count;
	}
	int val;//放置数据
	int count;//放置数据次数
};
int main()
{
	vector<int>vec;
	for(int i=0;i<200000;++i)
	{
		vec.push_back(rand()+i);
	}

	unordered_map<int,int>mmap;
	for(int i:vec)
	{
		//mmap.insert(make_pair(i,1));
		mmap[i]++;//[]运算符重载 查到数据则返回数据然后加一,没有查到,添加数据然后加一返回
	}//查重完
	priority_queue<Node,vector<Node>,greater<Node>> qq;
	int i=0;
	auto it=mmap.begin();
	for(;it!=mmap.end()&& i<10;++it,++i)//插入10个
	{
		qq.push(Node(it->first,it->second));
	}//top 10

	for(;it!=mmap.end();++it)//插入一个比较一个
	{
		if(it->second > qq.top().count)
		{
			qq.pop();
			qq.push(Node(it->first,it->second));
		}
	}
	while(!qq.empty())//打印
	{
		cout<<qq.top().val<<":"<<qq.top().count<<endl;
		qq.pop();
	}
	return 0;
}
发布了10 篇原创文章 · 获赞 0 · 访问量 476

猜你喜欢

转载自blog.csdn.net/zxc1803/article/details/88805477