1. 思路
难点在于把时间复杂度降低到O(nlogn),考虑使用unordered map,先统计所有数出现的概率,再把unordered map reverse一下,得到每个频数对应的原整数。
2.AC代码( 16 ms, faster than 96.39% of C++)
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int, int> map;
unordered_map<int, vector<int>> map_reverse;
for(int i=0; i<nums.size(); i++){
if(map.count(nums[i])) map[nums[i]] += 1;
else map[nums[i]] = 1;
}
for(auto i: map){
map_reverse[i.second].push_back(i.first);
}
vector<int> res;
for(int i=nums.size(); i>=1; i--){
if(map_reverse.count(i)) res.insert(res.end(), map_reverse[i].begin(), map_reverse[i].end());
if(res.size() == k) return res;
}
return res;
}
};