Monotonic Stack/Queue

流程大概是对每个元素,pop出之前每个不满足条件的元素(一般是index),对于pop出的元素,当前栈顶的是它的左边界,马上要入栈的当前元素是它的右边界。注意由于当前栈顶元素仍然可能被pop掉,所以左右边界没有确定的大小关系,能确定的是左右边界内的元素都大于/小于边界。

两个问题:

栈内元素是什么,出栈条件是什么 -- 是什么条件没有确定导致没法出栈

一个隐藏性质:

如果递增栈头元素为index i,若i-1不在栈里,则i-1d对应的值一定大于i对应的值,否则i-1应该在栈里,根据此条件可确定左边界

适合解决的问题类型:

  1. 求右侧第一个比自己大或小的元素。求的时候是在pop的过程中求出来的

  2. 求左侧第一个大于/小于自己的元素的位置,借由隐藏性质,在head和next head之间的元素都是不满足栈单调性的

  3. 综合起来 求左右比自己大或小的元素划定的边界范围

  • 「左侧」 查找就看 「插入栈」 时的栈顶元素,从 「右侧」 查找就看 「弹出栈」 时即将插入的元素。

Last updated