思路:从左往右遍历能作为3的数,并维护一个左侧的最小值,依次判断右边点的值能否满足大于维护的最小值且小于当前数,若存在则返回true
public boolean find132pattern(int[] nums) {
int left_min = nums[0];
for(int i = 1; i < nums.length - 1; i++){
int temp = nums[i];
if(temp > left_min){
for(int j = i + 1; j < nums.length; j++){
if(nums[j] < temp && nums[j] > left_min){
return true;
}
}
}else{
left_min = temp;
}
}
return false;
}
单调栈:即栈底到栈顶的元素是递增或者递减的
思路:上面暴力法的思路就是遍历一个3,在左侧始终维护一个最小值。然后在右侧找到2能满足条件
能否从右边开始遍历,始终维护一个小于3的最大值2,这里可以使用一个递减栈。
当从右往左遍历到一个新的数时,具体的做法可以分为3个部分:
1、判断当前数能否为1,若可以作为1则返回true,判断条件为是否小于维护的最大2
2、判断当前数能否为3,若该数大于栈顶的数则弹出栈顶的数,并与维护的最大2进行比较,直至栈顶数大于当前数或者栈为空
3、将当前数入栈作为2的候选
以[-1,3,2,0]作为例子进行模拟
初始:
max_two = Integer.MIN_VALUE
stack:0i
132用i,j,k代替
第一步:当前遍历数2
2>max_two,所以2不能为i
2>0,将0弹出后max_two= 0,栈为空停止判断
将2压入栈中
left_min = 0
stack:2
第二步:当前遍历数3
3>max_two,所以3不能为i
3>2,将2弹出后max_two = 2,栈为空停止判断
将3压入栈中
max_two = 2
stack:3
第三步:当前遍历数-1
-1 < max_two,所以-1可以为i,返回true
public boolean find132pattern(int[] nums) {
Stack<Integer> stack = new Stack<>();
int n = nums.length - 1;
stack.push(nums[n]);
int max_two = Integer.MIN_VALUE;
for(int i = n - 1; i >= 0; i--){
if(nums[i] < max_two){
return true;
}
while(!stack.isEmpty() && nums[i] > stack.peek()){
int temp = stack.pop();
if(temp > max_two){
max_two = temp;
}
}
stack.push(nums[i]);
}
return false;
}