Monotonic Stack/Queue
流程大概是对每个元素,pop出之前每个不满足条件的元素(一般是index),对于pop出的元素,当前栈顶的是它的左边界,马上要入栈的当前元素是它的右边界。注意由于当前栈顶元素仍然可能被pop掉,所以左右边界没有确定的大小关系,能确定的是左右边界内的元素都大于/小于边界。
两个问题:
栈内元素是什么,出栈条件是什么 -- 是什么条件没有确定导致没法出栈
一个隐藏性质:
如果递增栈头元素为index i,若i-1不在栈里,则i-1d对应的值一定大于i对应的值,否则i-1应该在栈里,根据此条件可确定左边界
适合解决的问题类型:
求右侧第一个比自己大或小的元素。求的时候是在pop的过程中求出来的
求左侧第一个大于/小于自己的元素的位置,借由隐藏性质,在head和next head之间的元素都是不满足栈单调性的
综合起来 求左右比自己大或小的元素划定的边界范围
从 「左侧」 查找就看 「插入栈」 时的栈顶元素,从 「右侧」 查找就看 「弹出栈」 时即将插入的元素。
Last updated