239. Sliding Window Maximum

来源:互联网 发布:淘宝硅胶充气娃娃 编辑:程序博客网 时间:2024/06/03 20:59

这道题是给一个数组和一个滑动窗口的长度k。如果让滑动窗口从数组的头部移动到数组的尾部,每移动一次记录下这个窗口中的最大值。

一开始想用set做,但是没有写对。看了别人的代码发现这个题是考察deque(双向队列)的用法。

定义一个deque的队列q,里面保存的是当前有可能成为窗口最大值的数的下标,下标,下标。重要的事情说三遍。,遍历数组,当遍历到nums[i]时,q中保存的数字最多是i - k - 1~i。所以首先看deque的头部是否小于i - k - 1,是的话要把队头的一个弹出。然后要做的是把nums[i]和队尾的数比较,如果队尾的数小,说明nums[i]加进去就没他什么事儿了,就把队尾弹出,重复这个过程直到队尾元素不再小于nums[i],这时候可以把nums[i]加入队尾了。这时候队头元素就是最大的,不然他早就被弹出去了。

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