1. 题目描述
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.
2. 思路
- 先使用unordered_map进行计数,键为数字,值为次数。时间复杂度O(n)
- 再将其复制到multimap中进行排序,其中键为1)中的数字出现的次数,值为对应的数字。注意指定map的比较参数。
- 最后输出multimap中的前K个pair中对应的value.
3. 算法
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int, int> umap;
for (auto n : nums) {
++umap[n];
}
multimap<int, int, greater<int>> imap;
for (auto iter = umap.cbegin(); iter != umap.cend(); ++iter)
imap.insert({iter->second, iter->first});
vector<int> ret;
auto iter = imap.cbegin();
for (int i = 0; i < k; ++i) {
ret.push_back(iter->second);
++iter;
}
return ret;
}
};