https: / / leetcode. cn/ problems/ sliding- window- maximum/ solution/ dong- hua- yan- shi- dan- diao- dui- lie- 239 hua- hc5u/
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。
输入:nums = [ 1 , 3 , - 1 , - 3 , 5 , 3 , 6 , 7 ] , k = 3
输出:[ 3 , 3 , 5 , 5 , 6 , 7 ]
解释:
滑动窗口的位置 最大值
-- -- -- -- -- -- -- - -- -- -
[ 1 3 - 1 ] - 3 5 3 6 7 3
1 [ 3 - 1 - 3 ] 5 3 6 7 3
1 3 [ - 1 - 3 5 ] 3 6 7 5
1 3 - 1 [ - 3 5 3 ] 6 7 5
1 3 - 1 - 3 [ 5 3 6 ] 7 6
1 3 - 1 - 3 5 [ 3 6 7 ] 7
来源:力扣(LeetCode)
链接:https: / / leetcode. cn/ problems/ sliding- window- maximum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解:
/******************************************************************************
Welcome to GDB Online.
GDB online is an online compiler and debugger tool for C, C++, Python, PHP, Ruby,
C
Code, Compile, Run and Debug online from anywhere in world.
链接:https://leetcode.cn/problems/sliding-window-maximum/solution/dan-diao-dui-lie-shi-xian-by-hei-niu-kai-f9p2/
*******************************************************************************/
using namespace std;
// 单调队列数据结构
// 1 ) 维护队列元素 先进先出的时间顺序,
// 2 ) 又能够正确维护队列中所有元素的最值;
// deque 支持在头部和尾部进行插入和删除,双向链表list也可
// 维护其中的元素 自尾到头部单调递增
class MonotonicQueue
{
public:
void push( int value ) {
// 从后向前 将前面小于自己的元素都删除
while ( ! maxq.empty( ) && maxq.back( ) < value) {
maxq.pop_back( ) ;
}
// 添加元素
maxq.emplace_back( value) ;
}
//如果每个元素在加入时都这样操作,最终单调队列中的元素大小
// 就会保持一个单调递减的顺序(单调队列大小 <= 窗口大小)
int max ( ) {
// 队头的元素肯定时最大的
return maxq.front( ) ;
}
// pop方法:删除队头元素
// 若这个将要移出窗口的旧数字就是队头,那需要把队头删掉,
// 否则就不用删除队头,因为这个元素在别的元素加入时已经被删掉了
void pop( int value) {
if ( value == maxq.front( )) {
maxq.pop_front( ) ;
}
}
private:
deque< int> maxq; //front( ) ,back( ) ,push_back( value) ,push_front( value) ,pop_back( ) ,pop_front( )
} ;
class Solution {
public:
vector< int> maxSlidingWindow( vector< int>& nums, int k) {
// 创建单调队列对象
MonotonicQueue monq;
// 记录结果数组
vector< int> res;
res.reserve( nums.size( ) - k + 1 ) ;
// 将 k - 1 个元素加入单调队列
for ( int i = 0 ; i < k - 1 ; ++i) {
monq.push( nums[ i] ) ;
}
for ( int i = k - 1 ; i < nums.size( ) ; ++i) {
// 入队
monq.push( nums[ i] ) ;
int max = monq.max( ) ; //返回最大值
res.emplace_back( max) ; //然后加入到结果中
// 出队
monq.pop( nums[ i - k + 1 ] ) ;
}
return res;
}
} ;
int main ( )
{
Solution *mysolo = new Solution( ) ;
vector< int> a = { 1,3 ,-1,-3,5,3,6,7} ;
vector< int> res = mysolo-> maxSlidingWindow( a,3) ;
for( auto v:res)
cout<< "-->" << v;
delete mysolo;
return 0 ;
}