Description
Given an integer array nums
and an integer k
, return the k
most frequent elements. You may return the answer in any order.
Example 1:
Input: nums = [1,1,1,2,2,3], k = 2 Output: [1,2]
Example 2:
Input: nums = [1], k = 1 Output: [1]
Constraints:
1 <= nums.length <= 105
-104 <= nums[i] <= 104
k
is in the range[1, the number of unique elements in the array]
.- It is guaranteed that the answer is unique.
Follow up: Your algorithm’s time complexity must be better than O(n log n)
, where n is the array’s size.
Code
三種解法都和 Top K Frequent Words 的觀念一樣。
Min Heap
Time Complexity: , Space Complexity:
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int, int> mp;
for(auto n: nums) {
mp[n]++;
}
// min heap
auto cmp = [](const pair<int, int>& p1, const pair<int, int>& p2) {
return p1.second > p2.second;
};
priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(cmp)> pq;
for(auto it: mp) {
pq.push({it.first, it.second});
while(pq.size() > k) {
pq.pop();
}
}
vector<int> res;
while(!pq.empty()) {
auto e = pq.top();
pq.pop();
res.push_back(e.first);
}
return res;
}
};
可以使用 capture by reference,就不需要 push pair 到 heap 上,只需要 push 一個 int。
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int, int> mp;
for(auto n: nums) {
mp[n]++;
}
auto cmp = [&](const int a, const int b) {
return mp[a] > mp[b];
};
priority_queue<int, vector<int>, decltype(cmp)> pq(cmp);
for(auto it: mp) {
pq.push(it.first);
while(pq.size() > k) {
pq.pop();
}
}
vector<int> res;
while(!pq.empty()) {
res.push_back(pq.top());
pq.pop();
}
return res;
}
};
Bucket Sort
Time Complexity: , Space Complexity:
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int, int> mp;
for(auto n: nums) {
mp[n]++;
}
vector<vector<int>> bucket(nums.size() + 1);
for(auto it: mp) {
bucket[it.second].push_back(it.first);
}
vector<int> res;
for(int i = bucket.size() - 1; i >= 0 && k > 0; i--) {
for(auto n: bucket[i]) {
res.push_back(n);
k--;
if(k == 0) break;
}
}
return res;
}
};