Maxwindow
struct WindowMax
{
//求窗口的最大值,需要对队列维护一个信息,由大到小
//遇到相同元素取后进的,因为虽然一样大,但是后进的晚过期
int L{ -1 }, R{-1};//窗口的左右边界,R是窗口右边界的下一个位置
//L和R分别窗口左右的上一个和下一个元素
vector<int> nums;
deque<int> Max;//存放元素的下标
WindowMax(vector<int> n):nums(n),L(-1),R(0){}
//窗口增大
void AddFromRight() {
if (R == nums.size()) {
return;
}
while (!Max.empty() && Max.back() <= nums[R]) {
Max.pop_back();
}
Max.push_back(R);
R++;
}
//窗口减小,如果窗口左边界跨过了最大值队列,最大值队列的相对应小标弹出
void RemoveFromLeft() {
if (L > R - 1) {//L>=R
return;
}
L++;
//L是窗口左边界的上一个位置
if (L == Max.front()) {
Max.pop_front();
}
}
int GetMax() {
if (!Max.empty()) {
return nums[Max.front()];
}
return INT_MIN;
}
};Last updated