首页 > 编程语言 >代码随想录算法训练营第十二天 239. 滑动窗口最大值 | 347.前 K 个高频元素

代码随想录算法训练营第十二天 239. 滑动窗口最大值 | 347.前 K 个高频元素

时间:2023-01-26 17:11:18浏览次数:61  
标签:347 第十二天 map int 随想录 pri 队列 vector que

队列应用 lc239 滑动窗口最大值

本题可以使用队列来记录窗口,但是想要记录最大值,则需要使用单调队列,而且我们只需要维护大值。

在添加元素时,先将比要添加元素小且在尾部的元素全部弹出,再添加元素。

class Solution {
private:
    class MyQueue{
    public:
        deque<int> que;
        void pop(int n){
            if(!que.empty() && n == que.front()){
                //cout<<"out "<<que.front()<<endl;
                que.pop_front();
            }
        }
        void push(int n){
            //先从尾部弹出所有小于n的值
            while(!que.empty() && que.back() < n){ //注意这里必须是小于,小于等于的话会造成误弹出,少一个元素
                //cout<<"outback "<<que.back()<<endl;
                que.pop_back();
            }
            que.push_back(n);
            //cout<<"in "<<que.back()<<endl;
        }
        int getMaxValue(){
            return que.front();
        }

    };
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        vector<int> result;
        MyQueue window;
        for(int i=0;i<k;i++){
            window.push(nums[i]);
        }
        //cout<<"finish initial"<<endl;
        result.push_back(window.getMaxValue());
        for(int i=k;i<nums.size();i++){
            window.pop(nums[i-k]);
            window.push(nums[i]);
            result.push_back(window.getMaxValue());
        }
        return result;
    }
};

优先级队列 lc347 前k个高频元素

本题有以下前置知识需要掌握

  • 大小顶堆,自定义优先级队列
  • 运算符重载,仿函数写法

优先级队列不错的讲解:
c++优先队列(priority_queue)用法详解 - 华山青竹 - 博客园 (cnblogs.com)

class Solution {
public:
    //因为将使用自定义数据类型,且需要小顶堆,将运算符进行重载,使用仿函数写法
    class mycomparison{
    public:
        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) {
        //使用map记录每个数字出现次数
        unordered_map<int,int> map;
        for(int i=0;i<nums.size();i++){
            map[nums[i]]++;
        }

        //创建一个小顶堆来进行排序(只需要维护k个)
        priority_queue<pair<int,int>, vector< pair<int,int> >, mycomparison> pri_que;

        //将map中的键值对放入小顶堆,且只维护k个组
        for(auto iter = map.begin(); iter != map.end(); iter++){
            pri_que.push(*iter);
            if(pri_que.size() > 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;
    }
};

标签:347,第十二天,map,int,随想录,pri,队列,vector,que
From: https://www.cnblogs.com/frozenwaxberry/p/17067935.html

相关文章