本公司現在要給公司員工發波福利,在員工工作時間會提供大量的水果供員工補充營養。由於水果種類比較多,但是卻又不知道哪種水果比較受歡迎,然後公司就讓每個員工報告了自己最愛喫的k種水果,並且告知已經將所有員工喜歡喫的水果存儲於一個數組中。然後讓我們統計出所有水果出現的次數,並且求出大家最喜歡喫的前k種水果。
分析:一看這題就是典型的求數組中出現次數最多的前k個數,
首先我們應該用哈希表或map先統計元素出現的次數,在用堆(優先級隊列)求出次數最多的前k個數。
struct Compare //函數對象,堆中的元素比較的方式
{
bool operator()(map<int,int>::iterator it1, map<int,int>::iterator it2)
{
return it1->second < it2->second;
}
};
void GetFavoriteFruit(const vector<int>& fruits, size_t k)
{
if(fruits.empty()||k <1)
return ;
map<int,int> m;
for(int i = 0; i < fruits.size(); ++i)
{
m[ fruits[i] ]++; //1.統計每種水果出現的次數,linux底下沒有unordered_map,所以用map
}
map<int,int>::iterator it = m.begin();
while(it != m.end())
{
cout << it->first << " "<<it->second << endl;
it++;
}
cout << "*************************************************"<<endl;
priority_queue<map<int,int>::iterator, vector<map<int,int>::iterator>,Compare> q; //創建一個元素類型是map迭代器的大堆。
it = m.begin(); //將map迭代器存入優先級隊列中。
while(it != m.end() )
{
q.push(it);
it++;
}
for(int i = 0; i < k; ++i)
{
cout << "元素:"<< q.top()->first << "出現幾次:"<< q.top()->second <<endl;
q.pop();
}
}