单调栈 LeetCode456 132模式

这篇博客探讨了一种使用单调栈解决数组中132模式的算法。通过从右往左遍历数组,维护一个递减栈,判断当前数是否可以作为1或3,并更新最大2的值,从而高效地找到132模式的存在。示例代码展示了如何在遍历过程中利用栈操作来实现这一方法。
摘要由CSDN通过智能技术生成

在这里插入图片描述
思路:从左往右遍历能作为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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值