347

典型可以使用优先队列的。

class Solution {
public:
    vector<int> topKFrequent(vector<int>& nums, int k) {
        
        assert(k>0);
        
        //统计每个元素出现的频率
        unordered_map<int,int> freq;   //<元素,频率>
        for(int i=0; i<nums.size();i++){
            freq[nums[i]] ++;  
        }
        
        assert(k<=freq.size());
        
        //扫描freq,维护当前出现频率最高的k个元素
        //在优先队列中,按照频率排序,所以数据对是(频率,元素)的形式.因为在pair中比较时,先比较的是频率
        priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>> > pq;  //优先队列,从小到大排序
        
        for(unordered_map<int, int>::iterator iter = freq.begin(); iter!=freq.end(); iter++){
            
            //当前的优先队列已经维护了k个出现频率最高的元素
            if(pq.size() == k){
                if(iter->second > pq.top().first){
                    pq.pop();   //将更小频率的元素扔掉
                    pq.push(make_pair(iter->second, iter->first));
                }
            }
            else
                pq.push(make_pair(iter->second, iter->first));
        }
        
        vector<int> res;
        while(!pq.empty()){
            res.push_back(pq.top().second);
            pq.pop();
        }
        return res;
    }
};

猜你喜欢

转载自www.cnblogs.com/Bella2017/p/10421960.html
347