87、【栈与队列】leetcode ——347. 前 K 个高频元素:优先队列(小根堆)+Hash表(C++版本)
题目描述
原题链接:347. 前 K 个高频元素
一、优先队列(小根堆)+Hash表
使用Hash表存nums
中各元素出现次数,维护一个优先级队列,在里面存k个数,采用小根堆方式,从小到大进行排列。当存入的数多余k个时,将队头(最小值)弹出。
C++优先队列(priority_queue)用法详解、【C++】小白友好【优先队列的基础知识】
STL 中,priority_queue 容器适配器的定义如下:
template <typename T,
typename Container=std::vector<T>,
typename Compare=std::less<T> >
class priority_queue{
//......
}
默认的构建方式为大根堆:less<>
使用自定义的数据类型的时候,可以重写比较函数,也可以进行运算符重载(less
重载小于“<”运算符,构造大根堆;greater
重载大于“>”运算符,构造小根堆)。
class Solution {
public:
class mycomparison {
public:
// 小根堆的方式。注:< 为大根堆
// rhs初始时,指向新加入元素。
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) {
// key为nums中的数,value为nums的出现次数
unordered_map<int, int> record;
for(int num : nums) {
record[num]++;
}
// 建立小根堆排列方式的优先队列
priority_queue<pair<int, int>, vector<pair<int, int>>, mycomparison> pri_que;
for(unordered_map<int, int>::iterator it = record.begin(); it != record.end(); it++) {
pri_que.push(*it);
// 插入元素个数k时,弹出当前的最小值
if(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;
}
};
时间复杂度
O
(
n
l
o
g
k
)
O(n logk)
O(nlogk)(堆中至多k个,每次调整堆需要
O
(
l
o
g
k
)
O(logk)
O(logk))
空间复杂度
O
(
n
)
O(n)
O(n)
参考文章:
347.前 K 个高频元素、前 K 个高频元素
相关文章
- c++的新型数组
- 《LeetCode刷题C/C++版答案》pdf出炉,白瞟党乐坏了
- C/C++socket send函数MSG_NOSIGNAL
- C++题目东华
- 《数字图像处理与机器视觉——Visual C++与Matlab实现》——1章 Matlab图像处理编程基础
- 基于Qt5(C++)+SQLite 开发的一个小巧精美的本地音乐播放器【100010532】
- 《计算机系统:核心概念及软硬件实现(原书第4版)》——第2章 C++
- 187、【栈与队列】leetcode ——42. 接雨水(C++版本)
- 186、【栈与队列】leetcode ——503. 下一个更大元素 II(C++版本)
- 185、【栈与队列】leetcode ——496. 下一个更大元素 I:单调栈-哈希表(C++版本)
- 172、【动态规划】leetcode ——714. 买卖股票的最佳时机含手续费 (C++版本)
- 164、【动态规划】leetcode ——213. 打家劫舍 II:环形列表线性化(C++版本)
- 133、【贪心算法】leetcode ——1005. K 次取反后最大化的数组和(模拟变化+贪心策略)(C++版本)
- 129、【动态规划/贪心算法】leetcode ——53. 最大子数组和(C++版本)
- 128、【贪心算法】leetcode ——376. 摆动序列(C++版本)
- 126、【回溯算法】leetcode ——332. 重新安排行程:回溯算法(C++版本)
- 120、【回溯算法】leetcode ——93. 复原 IP 地址(C++版本)
- 117、【回溯算法】leetcode ——39. 组合总和:回溯法+剪枝优化(C++版本)
- 89、【树与二叉树】leetcode ——101. 对称二叉树:后序递归+迭代法+层次遍历(C++版本)
- 86、【栈与队列】leetcode ——39. 滑动窗口最大值:单调队列+滑动窗口(C++版本)
- 82、【栈与队列】leetcode ——225. 用队列实现栈(C++版本)
- 81、【栈与队列】leetcode ——232. 用栈实现队列(C++版本)
- Effective C++ 第二版 40)分层 41)继承和模板 42)私有继承
- hdu 1251 统计难题 (字典树(Trie)<PS:C++提交不得爆内存>)