单调栈与单调队列
题目存在一个性质让栈与队列中元素有单调性,重点思路在于一个“删”字
单调栈
找左边最近最小的数,若下一个入栈的数比前一个数小,那么前一个数就没有存在的必要了,就将其删除。
1.删除
2.输出
3.入栈
stack<int> st;
for(int i = 0; i < n; i ++) {
int x;
cin >> x;
//删
while(!st.empty() && st.top() >= x) {
st.pop();
}
//输出
if(!st.empty()) {
cout << st.top() << " ";
} else {
cout << "-1" << " ";
}
//入栈
st.push(x);
}
单调队列
1.出队,队头不在窗口内
2.删除元素
3.入队
4.输出最大/小的那个数
//最小,单调递增,下一个最小时需要队中所有元素出队
for(int i = 0; i < n; i ++) {
if(!q.empty() && q.front() < i - k + 1) {
q.pop_front();
}
while(!q.empty() && a[i] <= a[q.back()]) {
q.pop_back();
}
q.push_back(i);
if(i + 1 >= k) {
cout << a[q.front()] << " ";
}
}
q.clear();
//最大,单调递减,下一个最大时需要队中所有元素出队
for(int i = 0; i < n; i ++) {
if(!q.empty() && q.front() < i - k + 1) {
q.pop_front();
}
while(!q.empty() && a[i] >= a[q.back()]) {
q.pop_back();
}
q.push_back(i);
if(i + 1 >= k) {
cout << a[q.front()] << " ";
}
}
浙公网安备 33010602011771号