Day13 栈与队列 part03

本文介绍了LeetCode中的两道题目,分别是使用单调队列求解滑动窗口最大值和利用小顶堆找出前k个高频元素。主要讲解了如何运用数据结构如队列和优先队列来优化算法效率。
摘要由CSDN通过智能技术生成

1.leetcode239——滑动窗口最大值

核心思想:单调队列,没有必要维护窗口里所有元素,只需要维护有可能成为窗口里最大值的元素。确保出口处的元素是队列里的最大元素,队列为单调递减队列。


由三个主要函数构成

pop:只有当value==que.front(),才弹出

push:只有当value>que.back()才弹入,否则que.pop_back()

front: return que.front()

main函数:

  • 先弹入K个元素,保证队列不为空
  • 弹入之后,获得前K个元素的最大值 result.push_back(que.front());
  • 再for循环, 依次pop,push,front

注意:

  • 每次先判断队列是否为空再进行元素判断
  • 先写一个private:

private:

       class MYQUE{

public: 

        deque<int> que;

        void pop(int value)

        void push(int value)      

};

  • main 函数里要定义一个队列和一个数组 MYQUE que; vector<int> result;

2.leetcode 347——前k个高频元素

核心思想:

  • 用map将元素值和元素频率存进去
  • 做一个小顶堆(可以用优先队列),堆顶储存最小元素,堆里始终保持K个元素,当堆的元素大于K时,将堆顶(堆里的最小值)弹出
  • 将堆里的元素打印出来,堆顶是最小元素,所以从尾部开始打印,第(k-1)个元素

注释:

  1. 优先队列默认为大顶堆

        priority_queue<pair<int,int>, vector<int,int>, comparsion> 

  • pair<int, int>: 优先队列中存储的数据类型;
  • vector<int, int>L 指定优先队列用vector存储数据
  • comparsion: 自定义的排序方法(将大顶堆改为小顶堆)

      2. 自定义的排序方法:

        comparsion:

        class comparsion{

        bool operator()(const pair<int,int>& up, const pair<int,int>){

                return up.second > down.second;

        };

  • return true: 
    • 代表第一个元素大于第二个元素,表示第一个元素应该排在第二个元素之后,远离堆顶
  • return false:
    • 代表第一个元素小于第二个元素,表示第一个元素应该排在第二个元素之前

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值