map 小顶堆的实现-基本语法和用法
题目:给定一个非空的整数数组,返回其中出现频率前k高的元素。
示例1:
输入:nums=[1,11,2,2,3],k=2 输出:[1,2
示例2
输入:nums=[1],k
输出:[1
提
你可以假设给定的k总是合理的,且1≤k≤数组中不相同的元素的个数。 你的算法的时间复杂度必须优于O( n log n),n是数组的大小。
题目数据保证答案唯一,换句话说,数组中前k个高频元素的集合是唯一的。
·你可以按任意顺序返回答案。
分析:注意写法
#include "_myPrint.cpp"
#include "deque"
#include "queue"
#include "stack"
using namespace std;
class Solution {
public:
//小顶堆 class in class
class mycomparison {
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; // map<nums[i],对应出现的次数>
for (int i = 0; i < nums.size(); i++) {
map[nums[i]]++;
}
// 对频率排序
// 定义一个小顶堆,大小为k
// 储存对象的类型 储存元素的底层容器 储存对象
priority_queue<pair<int, int>, vector<pair<int, int> >, mycomparison> pri_que;
// 用固定大小为k的小顶堆,扫面所有频率的数值
for (unordered_map<int, int>::iterator it = map.begin(); it != map.end(); it++) {
pri_que.push(*it);
if (pri_que.size() > k) { // 如果堆的大小大于了K,则队列弹出,保证堆的大小一直为k
pri_que.pop();
}
}
// 找出前K个高频元素,因为小顶堆先弹出的是最小的,所以倒叙来输出到数组
vector<int> result(k);
for (int i = k - 1; i >= 0; i--) {
result[i] = pri_que.top().first;
pri_que.pop();
}
return result;
}
};
class Solution2{
public:
// 储存对象 定义operator方法 为之后构造小顶堆
class mycompare{
public:
bool operator()(const pair<int, int>& lhs, const pair<int, int>& rhs){
return lhs.second > rhs.second;
}
};
vector<int> KthMax(vector<int>& nums, int k){
unordered_map<int, int> map;
// 统计每个数字出现的个数
for (int num : nums){
map[num]++;
}
// 初始化小顶堆
priority_queue<pair<int, int>, vector<pair<int, int> >, mycompare> pri_que;
// 遍历map 始终保持小顶堆元素个数为k 超过的就pop 小顶堆会自动排序 所以pop掉的是最小的元素
for (unordered_map<int, int>::iterator it = map.begin(); it != map.end(); it++){
pri_que.push(*it);
while (pri_que.size() > k) pri_que.pop();
}
// 小顶堆增序 逆序赋值给结果
vector<int> res(k);
for (int i = k - 1; i >= 0; i--){
res[i] = pri_que.top().first;
pri_que.pop();
}
return res;
}
};
int main(){
Solution2 s;
vector<int> nums = {1,1,1,2,2,3,4,4,4,44,4,4,4};
vector<int> res = s.KthMax(nums,2);
printCollection p;
p.printVector(res);
}