堆排序
class Solution {
public:
void heap_adjust(vector<pair<int,int>>& heap, int i, int n) {
auto key = heap[i];
int j = 2*i;
while(j<=n){
if(j+1 <= n && heap[j].second > heap[j+1].second) {
j++;
}
if (key.second <= heap[j].second) {
break;
}
heap[j/2] = heap[j];
j*=2;
}
heap[j/2] = key;
}
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int, int> dict;
for(int i=0;i<nums.size();i++){
dict[nums[i]]++;
}
vector<pair<int,int>> heap(1);
for(auto it = dict.begin();it!=dict.end();it++){
heap.push_back(*it);
}
int n = heap.size() - 1;
for(int i=n/2;i>=1;i--){
heap_adjust(heap, i, n);
}
for(int i=n;i>1;i--){
swap(heap, 1, i);
heap_adjust(heap, 1, i-1);
}
vector<int> res;
for(int i=1;i<=k;i++){
res.push_back(heap[i].first);
}
return res;
}
void swap(vector<pair<int, int>> &heap, int i, int j){
auto temp = heap[i];
heap[i] = heap[j];
heap[j] = temp;
}
};