滑动窗口的最大值-LintCode

来源:互联网 发布:新建视图 sql语句 编辑:程序博客网 时间:2024/06/14 23:46

给出一个可能包含重复的整数数组,和一个大小为 k 的滑动窗口, 从左到右在数组中滑动这个窗口,找到数组中每个窗口内的最大值。

样例:
给出数组 [1,2,7,7,8], 滑动窗口大小为 k = 3. 返回 [7,7,8].

解释:
最开始,窗口的状态如下:
[|1, 2 ,7| ,7 , 8], 最大值为 7;
然后窗口向右移动一位:
[1, |2, 7, 7|, 8], 最大值为 7;
最后窗口再向右移动一位:
[1, 2, |7, 7, 8|], 最大值为 8.

挑战 :
O(n)时间,O(k)的额外空间

#ifndef C362_H#define C362_H#include<iostream>#include<vector>#include<deque>using namespace std;class Solution {public:    /*    * @param nums: A list of integers    * @param k: An integer    * @return: The maximum number inside the window at each moving    */    vector<int> maxSlidingWindow(vector<int> nums, int k) {        // write your code here        vector<int> v;        if (nums.empty())            return v;        int len = nums.size();        deque<int> deq;        for (int i = 0; i < k; ++i)        {            while (!deq.empty() && nums[i] >= nums[deq.back()])//保证滑动窗口最大值的索引总在队列头部                deq.pop_back();            deq.push_back(i);        }        for (int i = k; i < len; ++i)        {            v.push_back(nums[deq.front()]);            while (!deq.empty() && nums[i]>nums[deq.back()])//若新值大于队头索引对应的值,则删除元队列中的所有元素,新值的索引为队头;若并不大于,则从队尾减除值比它小的索引,找到其合适的位置                deq.pop_back();            while (!deq.empty() && deq.front() <= i - k)//若队头最大值已滑出窗口,则从队头开始删减,最终把新值添加到队尾                deq.pop_front();            deq.push_back(i);        }        v.push_back(nums[deq.front()]);        return v;    }};#endif
原创粉丝点击