Given a non-empty array of integers, return the k most frequent elements.
Example 1:
Input: nums = [1,1,1,2,2,3], k = 2
Output: [1,2]
Example 2:
Input: nums = [1], k = 1
Output: [1]
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.
- It’s guaranteed that the answer is unique, in other words the set of the top k frequent elements is unique.
- You can return the answer in any order.
Problem Analysis:
We can count all elements’ frequency, return the k most frequent elements. For counting, we can use a hashmap, then using a priority queue to get the final elements
Solution:
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int, int> store;
for (const auto item: nums) store[item] += 1;
auto my_comp = [](const pair<int, int>& lhs, const pair<int, int>& rhs) {
return lhs.second > rhs.second;
};
priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(my_comp)> queue(my_comp);
for (const auto& item: store) {
if (queue.size() < k) {
queue.push(make_pair(item.first, item.second));
} else {
if (item.second > queue.top().second) {
queue.pop();
queue.push(make_pair(item.first, item.second));
}
}
}
vector<int> res(k, 0);
for (int i = 0; i < k; ++i) {
res[i] = queue.top().first;
queue.pop();
}
return res;
}
};
Time Complexity: O(max(n, klogk))
Space Complexity: O(n)