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