给出一个可能包含重复的整数数组,和一个大小为 k 的滑动窗口, 从左到右在数组中滑动这个窗口,找到数组中每个窗口内的最大值。
样例
样例 1:
输入:
[1,2,7,7,8]
3
输出:
[7,7,8]
解释:
最开始,窗口的状态如下:`[|1, 2 ,7| ,7 , 8]`, 最大值为 `7`;
然后窗口向右移动一位:`[1, |2, 7, 7|, 8]`, 最大值为 `7`;
最后窗口再向右移动一位:`[1, 2, |7, 7, 8|]`, 最大值为 `8`.
样例 2:
输入:
[1,2,3,1,2,3]
5
输出:
[3,3]
解释:
最开始,窗口的状态如下: `[|1,2,3,1,2 | ,3]` , 最大值为`3`;
然后窗口向右移动一位.`[1, |2,3,1,2,3]`, 最大值为 `3`;
挑战
O(n)时间,O(k)的额外空间
class Mono
{
private:
deque<int> data;
public:
void push(int n)
{
while(!data.empty() && data.back() < n)
{
data.pop_back();
}
data.push_back(n);
}
int max()
{
return data.front();
}
void pop(int n)
{
if(!data.empty() && data.front() == n)
{
data.pop_front();
}
}
};
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
Mono window;
vector<int> res;
for(int i = 0; i < nums.size(); i++)
{
if(i<k-1)
{
window.push(nums[i]);
}
else
{
window.push(nums[i]);
res.push_back(window.max());
window.pop(nums[i-k+1]);
}
}
return res;
}
};