LeetCode-347. 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.
解题思路:本题要求是输出频率最大的k个元素,可以先利用unordered_map来统计各元素的个数,再利用priority_queue来对统计的频数进行排序。
class Solution
{
public:
vector<int> topKFrequent(vector<int>& nums, int k)
{
unordered_map<int, int> mp;
priority_queue< pair<int, int> > que;
vector<int> res;
for (auto a : nums)
{
mp[a]++;
}
for (auto it=mp.begin();it!=mp.end();++it)
{
que.push(make_pair(it->second, it->first));
if (que.size() > mp.size() - k)
{
res.push_back(que.top().second);
que.pop();
}
}
return res;
}
};
此题也可以利用最小堆,时间复杂度O(nlogk),上面的最大堆是O(nlog(n-k))[取决于K的大小,k较小时最小堆更快]
class Solution
{
public:
vector<int> topKFrequent(vector<int>& nums, int k)
{
unordered_map<int, int> mp;
priority_queue< pair<int, int>,vector<pair<int,int>>,bigger > que;
vector<int> res;
for (auto a : nums)
{
mp[a]++;
}
for (auto it = mp.begin(); it != mp.end(); ++it)
{
if (que.size() < k)que.push(*it);
else if (que.top().second < it->second)
{
que.pop();
que.push(*it);
}
}
while (!que.empty())
{
res.push_back(que.top().first);
que.pop();
}
return res;
}
private:
struct bigger
{
bool operator()(pair<int, int>&left, pair<int, int>right)
{
return left.second > right.second;
}
};
};