day19之找出最喜歡喫的前k種水果(數組中次數出現最多的前k個數)

本公司現在要給公司員工發波福利,在員工工作時間會提供大量的水果供員工補充營養。由於水果種類比較多,但是卻又不知道哪種水果比較受歡迎,然後公司就讓每個員工報告了自己最愛喫的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();
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章