常见模型:找出每个数左边离它最近的比它大/小的数 int tt = 0; for (int i = 0; i < n; i ++ ) { //看是更大(从栈里面找,也就是栈顶 > x ==》输出,<=x 弹出栈)还是更小, while (tt && check(stk[tt], i)) tt -- ; //--- if(tt)
//可以不存结果,直接输出 //--- stk[ ++ tt] = i; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
常见模型:找出每个数右边边离它最近的比它大/小的数 int tt = 0; for (int i = n-1; i >= 0; i -- ) { //看是更大(从栈里面找,也就是栈顶 > x ==》输出,<=x 弹出栈)还是更小, while (tt && check(stk[tt], i)) tt -- ; //--- if(tt)
//存入结果 ans[i]=stk[tt] //--- stk[ ++ tt] = i; }
单调队列
1 2 3 4 5 6 7 8 9
常见模型:找出滑动窗口中的最大值/最小值 int hh = 0, tt = -1; for (int i = 0; i < n; i ++ ) { while (hh <= tt && check_out(q[hh])) hh ++ ; // 判断队头是否滑出窗口,可以写if while (hh <= tt && check(q[tt], i)) tt -- ; q[ ++ tt] = i; }