(leetcode题解)Top K Frequent Elements

Given a non-empty array of integers, return the k most frequent elements.

For example,
Given [1,1,1,2,2,3] and k = 2, return [1,2].

Note: 

  • You may assume k is always valid, 1 ≤ k ≤ number of unique elements.
  • Your algorithm's time complexity must be better than O(n log n), where n is the array's size.

对于这种统计出现个数的题目,一般用map或unordered_map进行统计先,我开始的想法是通过统计之后,再用sort函数对pair的second进行排序输出,不过在leetcode的编译器一直不能识别重新定义的比较算法,我试着在本地ide上运行是可以通过的。

贴出C++代码:

//重新定义的比较函数
bool compete(const pair<int,int>& a,const pair<int,int>& b)
{
    return a.second > b.second;
}
vector<int> topKFrequent(vector<int>& nums, int k) {
    map<int,int> vec;
    vector<int> res;
    vector<pair<int,int>> m_pair;
    for(int i=1;i<nums.size();i++)
    {
        vec[nums[i]]++;
    }
    for(auto &i:vec)
        m_pair.push_back(i);
    sort(m_pair.begin(),m_pair.end(),compete);  //通过比较second排序
    auto iter=m_pair.begin();
    for(int i=0;i<k;i++)
    {
        res.push_back(iter->first);
        iter++;
    }
    return res;
}

之后我改为优先队列,即统计个数之后,用优先队列对pair的second进行排序,再输出前k个即可,代码如下

vector<int> topKFrequent(vector<int>& nums, int k) {
        map<int,int> vec;
        vector<int> res;
        priority_queue<pair<int,int>> p;
        for(int i=0;i<nums.size();i++)
        {
            vec[nums[i]]++;
        }
        for(auto &i:vec)
            p.push(make_pair(i.second,i.first));    //比较的是second
        for(int i=0;i<k;i++)
        {
            res.push_back(p.top().second);
            p.pop();
        }
        return res;
    }
原文地址:https://www.cnblogs.com/kiplove/p/6957474.html