单调队列-滑动窗口最大值

题目:给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。
思路:通过双端队列,因为只看得到k个数字,所以先在队列放入k个数字,并且每次放入时都要将他与队列里所拥有的数比较,一直找到第一个大于他的数,小于的全部弹出,这样处理完之后队列的最后一个数就是前k个最大值;再处理后面的数,后面的数同前k个数一样,压入的时候一直找到比他大的数,将小的数全部压出,随后再进行判断,如果队列的最后一个数下标小于等于i-k(数字下标从开始),因为要处理的是连续k个数,所以这种情况代表这个数不在这连续k个数以内,弹出她。

点击查看代码
   deque<int> q;
        vector<int> ans;
        for (int i = 0; i <= k - 1; i++)//先处理先k个数
        {
            while (q.size() && nums[q.back()] <= nums[i])//找到大于他的数,如果没有数了,它就是头,即连续区间最大值
            {
                q.pop_back();//小于他的压出,因为是队列,所以是在队尾压出
            }
            q.push_back(i);
        }
        ans.push_back(nums[q.front()]);
        for (int i = k; i < nums.size(); i++)
        {
            while (q.size() && nums[i] > nums[q.back()])//找到大于他的数,如果没有数了,它就是头,即连续区间最大值
            {
                q.pop_back();
            }
            q.push_back(i);
            while (q.front() <= i - k)//小于等于i-k即代表这个数下标过小,淘汰
            {
                q.pop_front();
            }
            ans.push_back(nums[q.front()]);
        }
        return ans;
    }
posted @ 2024-07-24 18:38  台州第一深情  阅读(8)  评论(0编辑  收藏  举报