239 滑动窗口最大值
主要是学习怎么使用单调队列,在这道题中,我们需要队列能够很快的输出最大值;同时还需要删除窗口移动后的不在窗口内的元素
接下来的问题就是实现push,pop,front。
push:逻辑上来说,当接收到一个新元素时,应该把它插入到队列中,因此需要出队比它小的,插入后再重新入队。但实际上,因为我们只需要那些又可能成为最大值的元素,因此将比它小的元素删除后其实并不需要重新入队了。
pop:和上面相似,只有当我们要删除的元素等于最大值(也就是队列头时),才进行删除。否则就不需要操作,不删除也不会影响得到的结果;
front:直接返回队列头即可
class Solution {
public:
class MyQuene
{
public:
deque<int> que;
void pop( int value )
{
if( !que.empty() && value == que.front() )
que.pop_front();
}
void push( int value )
{
//从队尾不断删除比value小的值,然后入队value
while( !que.empty() && value > que.back() )
que.pop_back();
que.push_back( value );
}
int front()
{
return que.front();
}
};
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
MyQuene que;
vector<int> result;
for(int i = 0; i < k; i++)
{
que.push( nums[i] );
}
result.push_back( que.front() );
for( int i = k; i < nums.size(); i++)
{
que.pop( nums[ i-k ] );
que.push( nums[ i ] );
result.push_back(que.front() );
}
return result;
}
};

浙公网安备 33010602011771号