leetcode——优先队列

二、高频题目

973. 最接近原点的 K 个点
——优先队列,默认大根堆
1、建立优先队列pair<int,int>,first为坐标到原点的距离,second为坐标索引
2、根据堆的索引 将坐标元素进行整理

23. 合并K个升序链表
——分治合并
1、写出两链表合并逻辑
2、编写分治合并,根据数组的left和right进行递归结束,二分,合并操作
3、调用分治合并
——利用堆合并

347. 前 K 个高频元素
——优先队列(<构建的是大根堆,>构建的是小根堆)
1、哈希表计数
2、创建优先队列pair<int,int> 第一个为数字的值,第二个为数字出现的次数
3、将前k个放入优先队列,当k+1~n个元素,不断取出小根堆的堆顶进行更新
4、将优先队列转为答案向量

692. 前K个高频单词
——优先队列
1、哈希表技术
2、创建优先队列pair<string,int>第一个为单词的值,第二个为单词出现的次数
3、将前k个放入优先队列,当k+1~n个元素,不断取出小根堆的堆顶进行更新
4、将队列的元素取出进行结果返回

767. 重构字符串
——哈希计数+优先队列
1、记录字母的出现次数 和最大的出现次数
2、若存在字母出现次数大于(length+1)/2 则不可行
3、将哈希表转优先队列priority<char,…>,cmp排序基于哈希表计数,构建大根堆
4、优先队列size>1,则取队列高频两个字母进行组合,计数-1,若不为0,继续放入队列
5、优先队列元素剩余一个时记得不要遗漏

895. 最大频率栈
——哈希计数+哈希频率向量维护+最大频率变量
push
1、记录数字出现频率
2、更新数字出现的最大频率
3、构建出现频率 数组
pop
1、根据maxFreq 找到对应的元素列表
2、取向量的尾部 即最后压入向量的元素
3、更新该元素出现频率
4、向量弹出后为空 证明maxFreq不存在val 最大maxFreq改变

295. 数据流的中位数
——大根堆+小根堆
push
1、平衡时往大根堆加入元素——小根堆入,再弹出小根堆最小值放入大根堆
2、不平衡时往小根堆加入元素——大根堆入,再弹出大根堆最大值放入小根堆
pop
1、平衡时返回二者平均
2、不平衡时返回大根堆堆顶

1438. 绝对差不超过限制的最长连续子数组——与滑动窗口结合的最值使用队列解决
——滑动窗口+单调队列
1、申请两个单调队列 维护窗口最大值与最小值
2、滑动窗口指针初始化{
3、维护窗口最大值
4、维护窗口最小值
5、加入元素 right++
6、窗口最大值-最小值超过limit 不断left++
7、更新最大值
}

三、思考与收获

1、何时使用优先队列?
求前k个...
不断利用高频元素...
求中位数

2、如何使用优先队列?
1.将前k个元素先放入队列
2.将后面元素放入队列,同时弹出被淘汰的堆顶
3.若保持前k个大的元素,则构建小根堆  若保持前k个小的元素,则构建大根堆 默认构建大根堆

3、这类题除了优先队列还有什么解法?
1.利用sort排序
2.根据题目要求修改cmp
3.根据题目要求返回前k个

4、有什么需要注意的点?
获取优先队列队头函数为top()
创建优先队列前,建立的cmp函数指针指向lambda匿名函数

5、如何创建类型为pair的优先队列?
auto cmp=[](const pair<int,int>&a, const pair<int,int>&b ){
	return a.second>b.second;//构建小根堆};
priority_queue<pair<int,int>,vector<pair<int,int>,decltype(cmp)>  que(cmp);
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值