1 Star 0 Fork 0

手捧向日葵的花语/力扣题集

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
Project_2024_4_19_堆.txt 3.66 KB
一键复制 编辑 原始数据 按行查看 历史
手捧向日葵的花语 提交于 2024-04-21 22:36 . 堆练习
//https://leetcode.cn/problems/last-stone-weight/
//最后一块石头的重量
class Solution {
public:
int lastStoneWeight(vector<int>& stones) {
priority_queue<int> pq;
for(int i = 0; i < stones.size(); ++i)
pq.push(stones[i]);
while(pq.size() > 1)
{
int a = 0;
int b = 0;
int c = 0;
if(pq.size())
{
a = pq.top();
pq.pop();
}
if(pq.size())
{
b = pq.top();
pq.pop();
}
c = abs(a-b);
if(c != 0)
{
pq.push(c);
}
}
if(pq.size() < 1)
return 0;
return pq.top();
}
};
//////////////////////////////////////////////////////////////////////////////////////////////////////
//https://leetcode.cn/problems/kth-largest-element-in-a-stream/
//数据流中的第k大元素
class KthLargest {
public:
KthLargest(int k, vector<int>& nums) {
_k = k;
for(auto e : nums)
{
heap.push(e);
if(heap.size() > _k) heap.pop();
}
}
int add(int val) {
heap.push(val);
if(heap.size() > _k) heap.pop();
return heap.top();
}
private:
priority_queue<int,vector<int>,greater<int>> heap;
int _k;
};
//////////////////////////////////////////////////////////////////////////////////////////////////////
//https://leetcode.cn/problems/g5c51o/description/
//前K个高频元素
class Solution {
struct cmp
{
bool operator()(const pair<int,int> a, const pair<int,int> b)
{
return a.second > b.second;
}
};
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int,int> hash;
priority_queue<pair<int,int>, vector<pair<int,int>>, cmp> heap;
vector<int> ret;
for(int i = 0; i < nums.size(); ++i)
hash[nums[i]]++;
for(auto e : hash)
{
heap.push(e);
if(heap.size() > k)
heap.pop();
}
while(heap.size() && k--)
{
auto[a,b] = heap.top();
heap.pop();
ret.push_back(a);
}
return ret;
}
};
//////////////////////////////////////////////////////////////////////////////////////////////////////
为什么选最大的前k个元素要用小根堆?
排小根堆的话,来了大的元素他就往下沉,小的元素就被浮上来了,当堆中的数据个数超过 k 时,取堆顶元素之后,pop( ) 掉的就是堆中最小的元素。相当于大元素会把此时堆中最小的元素挤出堆。
大根堆反之。
//https://leetcode.cn/problems/top-k-frequent-words/
//前K个高频单词
class Solution {
struct cmp{
bool operator()(pair<string,int> a, pair<string,int> b)
{
if(a.second == b.second)
return a.first < b.first;
return a.second > b.second;
}
};
public:
vector<string> topKFrequent(vector<string>& words, int k) {
unordered_map<string,int> hash;
priority_queue<pair<string,int>, vector<pair<string,int>>,cmp> heap;
vector<string> ret;
for(int i = 0; i < words.size(); ++i)
hash[words[i]]++;
for(auto e : hash)
{
heap.push(e);
if(heap.size() > k)
heap.pop();
}
while(k--)
{
string t = heap.top().first;
ret.push_back(t);
heap.pop();
}
reverse(ret.begin(),ret.end());
return ret;
}
};
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/a-chao-must-work-hard/li-kou-question-set.git
git@gitee.com:a-chao-must-work-hard/li-kou-question-set.git
a-chao-must-work-hard
li-kou-question-set
力扣题集
master

搜索帮助