单调栈与单调队列

题目存在一个性质让栈与队列中元素有单调性,重点思路在于一个“删”字

单调栈

找左边最近最小的数,若下一个入栈的数比前一个数小,那么前一个数就没有存在的必要了,就将其删除。
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()] << " ";
    }
}
posted @ 2022-10-20 22:09  wushucan  阅读(8)  评论(0)    收藏  举报