347. Top K Frequent Elements**
https://leetcode.com/problems/top-k-frequent-elements/
题目描述
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)
, wheren
is the array’s size.
C++ 实现 1
哈希表统计个数, 最小堆取 TopK.
class Solution {
private:
struct Comp {
bool operator()(const pair<int, int> &p, const pair<int, int> &q) {
return p.second > q.second;
}
};
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int, int> record;
for (auto &n : nums) record[n] ++;
priority_queue<pair<int, int>, vector<pair<int, int>>, Comp> q;
for (auto &p : record) {
q.push(p);
if (q.size() > k) q.pop();
}
vector<int> res;
while (!q.empty()) {
res.push_back(q.top().first);
q.pop();
}
return res;
}
};
C++ 实现 2
哈希表统计个数, 最大堆取 TopK.
class Solution {
private:
struct Comp {
bool operator() (const pair<int, int> &p, const pair<int, int> &q) {
return p.second < q.second;
}
};
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int, int> record;
for (auto &n : nums) record[n] ++;
priority_queue<pair<int, int>, vector<pair<int, int>>, Comp> q;
for (auto &p : record) q.push(p);
vector<int> res;
while (k--) {
auto p = q.top();
q.pop();
res.push_back(p.first);
}
return res;
}
};