leetcode 239. 滑动窗口最大值

Problem: 239. 滑动窗口最大值

文章目录

  • 思路
  • 解题方法
  • 复杂度
  • Code
  • 通过

思路

封装一个单调队列,让这个队列的对首就是队列中的最大值,每次入队的时候,如果入队元素大于对尾,就弹出元素,让队首就是元素的最大值

解题方法

定义一个Myque的单调队列,手动实现push,pop,getMaxValue三个函数
push(int val):val是待入队的值,如果大于队尾就循环弹出队尾,最后才是把val从尾部加入双端队列

pop(int val):因为队push函数的改造,导致push的时候,弹出了很多的元素,val是本来滑动窗口的第一个元素,只有这个元素在push函数中没有被踢出去这个时候才需要调用pop_front()函数

getMaxValue:去双端队列的首部尾元素的最大值,返回

值得复用的地方:这里用到了c++中的面向对象中的一些知识,不仅仅只是STL容器中的知识,手动实现了一个单调队列,在单调队列中使用双端队列来存储值

复杂度

时间复杂度:
首先,需要将前 k 个元素入队,这个操作的时间复杂度为 O(k)。
然后,需要处理从第 k+1 个元素开始的每个元素:
模拟出栈操作的时间复杂度为 O(1)。
模拟入栈操作的时间复杂度为 O(1)。
获取当前滑动窗口的最大值的时间复杂度为 O(1)。
将最大值存入结果容器的时间复杂度为 O(1)。
因此,整个 maxSlidingWindow 函数的时间复杂度为 O(k + (n-k) * 1),其中 n 是输入向量 nums 的长度。
在最坏的情况下,k 等于 n,因此时间复杂度为 O(n)。

空间复杂度:
使用了一个自定义的队列 MyQue 来维护滑动窗口的最大值,该队列的大小不会超过窗口的大小 k。因此,其空间复杂度为 O(k)。
使用结果容器 result 来存储每个滑动窗口的最大值,其大小与输入向量 nums 的长度相同。因此,其空间复杂度为 O(n)。
因此,整个函数的总体空间复杂度为 O(k + n)。

Code

class Solution {
public:
    class MyQue{
        public:
            deque deq;
            void push(int val){
                // 如果要入队列的值大于队列最后一个元素得值,就循环弹出队列的最后一个元素,让que.front就是队列的最大值
                while(!deq.empty() && val>deq.back()){
                    deq.pop_back();
                }
                // 把所有小于入队值的队列中的元素弹出之后,就是入队值的入队
                deq.push_back(val);
            }
            void pop(int val){
                // 移除滑动窗口最前面的值和队首的值一样的时候才可以出队
                if(!deq.empty() && val== deq.front()){
                    deq.pop_front();
                }
            }
            int getMaxValue(){
                return deq.front();
            }
    };
    vector maxSlidingWindow(vector& nums, int k) {
        MyQue myque;
        vector result;
        // 先把前k个元素入队
        for(int i=0;i

通过

leetcode 239. 滑动窗口最大值_第1张图片

你可能感兴趣的:(#,我得leetcode之路,leetcode,算法,职场和发展)