题目链接:https://leetcode.com/problems/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记录每个数出现的频率,然后初始化一个长度为nums.size()+1的嵌套数组,数组索引对应频率,数组内容为相同频率的键值;对数组对大到小遍历,找到k个键值。
class Solution{
public:
vector<int> topKFrequent(vector<int>& nums,int k)
{
vector<vector<int>> bucket(nums.size()+1);
vector<int> result;
unordered_map<int,int> frequency;
for(auto num:nums)
frequency[num]++;
for(auto fre:frequency)
bucket[fre.second].push_back(fre.first);
for(int i=bucket.size()-1;i>=0&&result.size()<k;i--)
{
if(!bucket[i].empty())
{
for(auto num:bucket[i])
result.push_back(num);
}
}
return result;
}
};
class Solution {
public:
static bool cmp(pair<int, int>& m, pair<int, int>& n) {
return m.second > n.second;
}
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int, int> occurrences;
for (auto& v : nums) {
occurrences[v]++;
}
// pair 的第一个元素代表数组的值,第二个元素代表了该值出现的次数
priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(&cmp)> q(cmp);
for (auto& [num, count] : occurrences) {
if (q.size() == k) {
if (q.top().second < count) {
q.pop();
q.emplace(num, count);
}
} else {
q.emplace(num, count);
}
}
vector<int> ret;
while (!q.empty()) {
ret.emplace_back(q.top().first);
q.pop();
}
return ret;
}
};