456-132模式

456-132模式

力扣456

https://leetcode-cn.com/problems/132-pattern/

单调栈题目,用的很巧妙,不是普通的无脑单调栈,还涉及到单调栈的一个规律:循环出栈时,出栈的序列也满足反向单调栈的特点。比如下图递减栈在4入栈时:

根据这一现象,可以找到:比入栈值的大/小的最大最小值


本题思路:数组中想找132,机会最大的当然是1越小越好,2越接近3越好,2越大越好(也可以说成3越大越好,因为“2越接近3越好”)

我们从后往前遍历,先找比2大的3,因此构造单调递减栈,栈存的是每一个“3”,随着栈的慢慢迭代,栈顶3会越来越高,满足了“3越大越好”的题意。根据前面提到的性质,出栈的序列是递增栈,当遇到一个峰顶“3”时,最后一个出栈的就是比“3”小的最大的2,存起来,继续遍历的过程中,对比当前值(1)和存起来的(2),就知道是否满足132模式了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//从右往左构造单调递减栈
public boolean find132pattern(int[] nums) {
Deque<Integer> stack = new LinkedList<>();//单调递减栈,存值比存下标简单,代表了132中的3
int theTwo = Integer.MIN_VALUE;
for(int i = nums.length - 1; i >= 0; i--){
if(nums[i] < theTwo) return true;

while(!stack.isEmpty() && nums[i] > stack.peekLast()){
theTwo = stack.pollLast(); //最后一个出的肯定是比当前入栈小的最大值
}
stack.offerLast(nums[i]);
}
return false;
}

总之,很巧妙我觉得


其他单调栈系列题可以点这里

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×