leetcode 239.Sliding Window Maximum【单调栈】【hard】|刷题打卡

344 阅读1分钟

一、题目描述:

leetcode 239.Sliding Window Maximum: 给定一个整数数组nums,有一个大小为k的滑动窗口,它从数组的最左边移动到最右边。你只能在窗口中看到k数字。每次滑动车窗向右移动一个位置。返回滑动窗口的最大值。

二、思路分析:

1.类别

单调栈、双端队列

2.做题思路

这一题需是典型的运用单调栈和双端队列来解决的题目。用STL中的deque定义双端队列s,从左到右遍历nums,当s不为空并且队尾的元素作为index的nums值小于遍历值,就pop队尾元素。然后将当前的index加入双端队列,然后用s.front()==i-k的判断保证窗口的大小固定。当当前的index已经超过k之后,就在返回的vector中加入当前的最大值。注意最大值永远会在队头,这就是单调栈的作用。

三、AC 代码:

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        vector<int> res;
        deque<int> s;
        for(int i=0;i<nums.size();i++){
            while(!s.empty()&&nums[s.back()]<=nums[i]){
                s.pop_back();
            }
            s.push_back(i);
            if(s.front()==i-k){
                s.pop_front();
            }
            if(i+1>=k){
                res.push_back(nums[s.front()]);
            }
        }
        return res;
    }
};

四、总结

双端队列deque

  • 支持高效插入和删除容器的头部元素
  • 从头尾增加元素
    • void push_front(const T& x):队头增加一个元素X
    • void push_back(const T& x):队尾增加一个元素x
  • 从头尾删除元素
    • void pop_front():删除双端队列中最前一个元素
    • void pop_back():删除双端队列中最后一个元素

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情