一道例题,给定一串数字,求每连续k个数字的最大、最小值。
思路:初始化一个初始长度为k的单调队列,按从左到右加入元素,同时满足这个队列中的元素是递减的(也就是假如某个数被两个距离不超过k的大于他的数夹着,他会被从队尾调出队列)。得到最大值。
向右移动一格,假如队首离开范围,出队。往队尾加入元素前,把队尾的所有比它小的元素全部出队。
得到新的最大值。
#include<bits/stdc++.h> using namespace std; struct Monotone_Queue{ deque<int> q; void push(int value){ while(!q.empty()&&q.back()<value){ q.pop_back(); } q.push_back(value); } int front(){ return q.front(); } void pop(){ q.pop_front(); } }; struct Monotone_Stack{ stack<int> s; void push(int value){ while(!s.empty()&&s.top()<value){ s.pop(); } s.push(value); } int top(){ return s.top(); } void pop(){ s.pop(); } };
原文地址:https://www.cnblogs.com/Yinku/p/10472977.html
时间: 2024-11-05 17:01:22