class Solution {
public:
class cmp {
public:
bool operator () (const pair<int, int> &lhs, const pair<int, int> &rhs) {
return lhs.second > rhs.second; //把次数低的放在队首,即次数由小到大排(方便后面出队)
}
};
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int, int> map; //<元素, 元素出现次数>
for (int i = 0; i < nums.size(); i++) {
map[nums[i]]++;
}
priority_queue<pair<int, int>, vector<pair<int, int> >, cmp> que;
for (unordered_map<int, int>::iterator it = map.begin(); it != map.end(); it++) {
que.push(*it);
if (que.size() > k) que.pop();//先加入元素在判断队列大小,因为是小顶堆,所以pop的都是最小的
}
//题目可按任意顺序返回答案
vector<int> result;
while (k--) {
result.push_back(que.top().first);
que.pop();
}
//若要求有序,则要改变result的存放
/*vector<int> result(k);
for (int i = k - 1; i >= 0; i--) {
result[i] = que.top().first;
que.pop();
}*/
return result;
}
};
lhs (Left-Hand-Side)
rhs (Right-Hand-Side)