347. Top K Frequent Elements

class Solution {
public:
    vector<int> topKFrequent(vector<int>& nums, int k) {
        unordered_map<int,int> count;
        for(int i=0;i<nums.size();++i)
            ++count[nums[i]];
        vector<vector<int>> bucket(nums.size()+1,vector<int>());
        for(auto i=count.begin();i!=count.end();++i)
            bucket[i->second].push_back(i->first);
        vector<int> r;
        for(int i=nums.size();i>=0&&r.size()<k;--i)
            r.insert(r.end(),bucket[i].begin(),bucket[i].end());
        return r;
    }
};

1

要求算法复杂度比  O(n log n) 要好, 这就有点难了...  首先本来看题还挺简单, 不就是hash搞定, 结果看到最后 来个时间复杂度要求. 歇菜了

2

直接看答案了, discuss区第一名的答案直接就是On 的效率, 我只能说... 这帮人怎么这么聪明, 我怎么这么蠢

3

基本原理是先用hash做一个数字的次数统计, 这样得到一个结果比如说 1出现1次, 3出现2次, 5出现2次;  

接下来用一个vector<vector<int>>来遍历,  这个结构有两层vector,   v[i] 表示 出现了i次的数字集合; 按照上面的例子就是   v[1]={1} ,  v[2]={3,5}

4

好了, 由于索引本身就代表了出现频率,  也就省掉了排序; 从最大的索引,直接遍历一遍就搞定

原文地址:https://www.cnblogs.com/lychnis/p/9266119.html