day12第五章 栈与队列part03

栈与队列part03

1.记得补滑动窗口最大值

题目https://leetcode.cn/problems/sliding-window-maximum/

示意图https://code-thinking.cdn.bcebos.com/gifs/239.%E6%BB%91%E5%8A%A8%E7%AA%97%E5%8F%A3%E6%9C%80%E5%A4%A7%E5%80%BC.gif

2.前k个高频元素

题目https://leetcode.cn/problems/top-k-frequent-elements/

题解:

class Solution {

public:

  class mycomparison{

  public://小顶堆,根节点是最小频率的元素;当元素数量超过k时,先弹出根节点(频率低的)bool operator()(const pair<int, int>& lhs, const pair<int, int>& rhs) {return lhs.second>rhs.second;//map<元素数值,元素出现频率>}

  };

  vector<int> topKFrequent(vector<int>& nums, int k) {

​    unordered_map<int,int>map;//map<元素数值,元素出现频率>for(int i=0;i<nums.size();i++){

​      map[nums[i]]++;//遇到一个元素,其频率就加1}



​    priority_queue<pair<int, int>, vector<pair<int, int>>, mycomparison> pri_que;//定义小顶堆,大小为kfor(unordered_map<int, int>::iterator it = map.begin(); it != map.end(); it++){

​      pri_que.push(*it);if(pri_que.size()>k){//元素数量超过k时,先弹出根节点(频率低的)

​         pri_que.pop();}}



​    vector<int> result(k);for(int i=k-1;i>=0;i--){//先弹出频率低的,但要输出频率高到低的,所以倒序输出

​      result[i]=pri_que.top().first;//要的是元素(比较时根据出现频率)

​      pri_que.pop();}return result;

  }

};

盲点:

1.例如我们在写快排的cmp函数的时候,return left>right 就是从大到小,return left<right 就是从小到大

bool cmp(Range a,Range a){
    return a.right<a.right;//按区间结束位置从左到右(从小到大)排序
}

sort(a, a+n, cmp)

优先级队列的定义正好反过来了

  public://小顶堆,根节点是最小频率的元素;当元素数量超过k时,先弹出根节点(频率低的)

​    bool operator()(const pair<int, int>& lhs, const pair<int, int>& rhs) {

​      return lhs.second>rhs.second;//从小到大

​    }

3.小顶堆pta

最优合并问题

题目PTA | 程序设计类实验辅助教学平台 (pintia.cn)

降低时间复杂度,不用调用sort

4.总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值