首页 > 其他分享 >(13/60)滑动窗口最大值、前K个高频元素

(13/60)滑动窗口最大值、前K个高频元素

时间:2024-02-05 23:44:38浏览次数:27  
标签:map 13 队列 最大值 元素 60 int que push

滑动窗口最大值

leetcode:239. 滑动窗口最大值

第一个hard!work out!资源占用竟然如此之大,,

0787935dfe6cfe036710c9cf26393c5

单调队列法

思路

需要一个抽象的类队列数据结构,每轮移动时:1. 把队首pop;2.把下一元素push进队尾;3.获取队列最大值存入数组。

pop实现:每次移动时尝试(说“尝试”是因为可能已经弹出了)弹出队首元素(条件是队列非空且val==que.front)。

push实现:每次移动放入下一元素。放入元素前,从队尾弹出所有小于该元素的值。

getMax实现:返回队首。

复杂度分析

时间复杂度:O(N)。

空间复杂度:O(K)。队列最多有K个元素。

注意点

  1. 这只是单调队列的一种实现(只要保证队列单调递减或递增就是单调队列),实现写法不固定。
  2. deque是c++中stack和queue的底层实现容器,首尾都可以进出。
  3. vector可以push_back。
  4. c++对象声明不需要new(直接声明是生命周期在作用域内,内存从栈上分配;new分配的声明周期在new~delete之间,内存从堆上分配)。new的对象需要指针类型保存,访问时候用->。

代码实现

class Solution {
private:
    class myQue{
        public:
            deque<int> que;
            void pop(int val){
                // 每次移动尝试弹出最左侧的元素
                // 只有val==队首时候弹出(其他元素在push的时候就已经弹出了)
                if(!que.empty() && val == que.front()){
                    que.pop_front();
                }
            }   
            void push(int val){
                // 队尾插入,插入前弹出所有比val小的元素
                while(!que.empty() && val > que.back()){
                    que.pop_back();
                }
                que.push_back(val);
            }     
            int getMax(){
                return que.front();
            }
    };


public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        myQue que;
        vector<int> result;
        // 装填k个元素
        for(int i = 0;i < k;i++){
            que.push(nums[i]);  
        }
        // 获取前k个元素最大值
        result.push_back(que.getMax());
        // 移动size-k次
        for(int i = k;i < nums.size();i++){
            que.pop(nums[i - k]);
            que.push(nums[i]);
            result.push_back(que.getMax());
        }

        return result;
    }
};

前k个高频元素

leetcode:347. 前 K 个高频元素

优先队列法

思路

  1. 遍历数组用map记录元素出现聘书
  2. 遍历map用小堆顶(优先队列)来存储前k个元素。
  3. 倒序遍历结果数组,把优先队列倒序赋值进去。

复杂度分析

时间复杂度:O(N)。N大小的数组、map遍历各1次、k大小的数组遍历1次。

空间复杂度:O(N+K)。

注意点

  1. map等无下标容器用iterator遍历,迭代器加星号*可以取迭代器对应的值。
  2. 优先队列没有front只有top。
  3. 仿函数(Function Object/Functor)是指可以通过函数调用操作符'( )'执行的对象。具体来说是任何定义了'operator()'的类的实例,使得类的对象可以像函数一样调用,因此得名“仿函数”。

代码实现

class Solution {
private:
    class myComparision{
        public:
            bool operator()(const pair<int,int>& lhs,const pair<int,int>& rhs){
                return lhs.second > rhs.second;
            }
    };

public:
    // 用map试试
    // 遍历,用map记录元素出现频数
    // 小堆顶存储k个元素
    // 数组倒序存储结果
    vector<int> topKFrequent(vector<int>& nums, int k) {
        unordered_map<int,int> map;
        for(int i = 0;i < nums.size();i++){
            map[nums[i]]++;
        }

        priority_queue<pair<int,int>,vector<pair<int,int>>,myComparision> minPq;
        for(unordered_map<int,int>::iterator it = map.begin();it != map.end();it++){    
            minPq.push(*it);
            if(minPq.size() > k)
                minPq.pop();
        }

        vector<int> result(k);
        for(int i = k-1;i >= 0;i--){
            result[i] = minPq.top().first;
            minPq.pop();
        }

        return result;
    }
};

标签:map,13,队列,最大值,元素,60,int,que,push
From: https://www.cnblogs.com/tazdingo/p/18009023

相关文章

  • (11/60)有效的括号、删除字符串中所有相邻重复项、逆波兰表达式求值
    有效的括号leetcode:20.有效的括号实现思路遍历到左括号,入栈对应的右括号(方便遍历到右括号时进行对比);遍历到右括号,对比栈顶元素。把无效三种情况照顾到:1.左括号多了(遍历结束后栈不为空);2.左右括号不匹配(右括号时栈顶元素与当前元素对比);3.右括号多了(右括号时栈是空的)。复......
  • 【APP逆向13】JNI开发简介之一
    简介:在一些不一般的APP中,核心算法不是直接写在java代码中,如果直接写在java中,逆向人员只需要简单的反编译就能找到;如是就出现了JNI:javanativeinterface,Java本地开发接口,实现JAVA和C语言之间的相互调用。将核心算法写在C语言中。1.正向开发流程1.1:新建一个java类,实现核心......
  • [ARC135D] Add to Square 题解
    题目链接点击打开链接题目解法很牛的题!!!先考虑一步很牛的转化:把矩阵黑白染色,且\(i+j\)为奇数的位置的值取反,每次操作变为左上右下\(+v\),左下右上\(-v\)这样有啥好处?操作不会使行和列的和改变考虑答案的下界显然是:\(\max\{\)行的绝对值之和,列的绝对值之和\(\}\)这里给出......
  • 【2024潇湘夜雨】WIN11_Pro_23H2.22635.3139软件选装纯净版2.04
    【系统简介】=============================================================1.本次更新母盘来自WIN11_Pro_23H2.22635.3139.2.增加部分优化方案,手工精简部分较多。3.OS版本号为22635.3139。精简系统只是为部分用户安装,个别要求高的去MSDN下。4.集成《DrvCeo-2.16.0.0》网卡版、运......
  • 代码随想录算法训练营第十三天|239. 滑动窗口最大值 347.前 K 个高频元素 总结
    239.滑动窗口最大值题目链接:239.滑动窗口最大值-力扣(LeetCode)给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回 滑动窗口中的最大值 。思路:首先在不考虑......
  • java lambda 求分组内最大值
    可以使用lambda表达式,比较方便,这里主要想说下思路问题,之前一个时受到数据库的影响,一个是对api理解程度不够的原因,实现方式见方式一;后来有种恍然大悟的感觉,改成了方式二的实现;方式一:先分组,组内过滤每一条数据Map<String,List<UserLog>>collect=list.stream().collect(Collec......
  • Proxmox 7.4 使用vgpu_unlock,为GTX1060开启vGPU支持
    本文在2021年发布的博客《Proxmox5.4使用vgpu_unlock,为GTX1060开启vGPU支持》,介绍了ProxmoxVE5.4上部署vGPUunlock的操作步骤。 后续有发布了在 ProxmoxVE7.x上支持vGPU的博客《Proxmox7.2部署DoraCloud桌面云,支持vGPU》,实现了通过3个脚本完成vGPU的配置。 ......
  • (13)TreeView1前面带CheckBox显示
     这些节点都是动态生成,再设置。原理还是在前面显示图片实现procedureTForm1.FormCreate(Sender:TObject);varpnode,node:TTreeNode;beginwithTreeView1.Itemsdobeginnode:=Add(nil,'Item1');//动态生成一个节点node.ImageIndex:=......
  • ORA-600[kqlnrc_1]
    ORA-600[kqlnrc_1]目录ORA-600[kqlnrc_1]1.现象2.处理1.现象oracle后台日志alert.log,报错Errorsinfile/oracle/diag/rdbms/airxxxx/airxxxx1/trace/airxxxx1_ora_152214.trc(incident=32162):ORA-00600:�ڲ���������,����:[kqlnrc_1],[0x50AA46990],[],[],[],[],[],[],......
  • CF1348
    传送门A:一个组\(2^n+2^1+\dots+2^{\frac{n}{2}-1}\),另一个组剩下的。B:考虑不停循环。如果不同的数字超过\(k\),无解。否则先把原序列去重,然后把末尾补一些数补成\(k\)个,再把这个新序列循环\(n\)次。C:先把字符们排序。肯定先把最小的\(k\)个字符作为各自的开头......