题意:给你一个整数数组 nums ,数组***有 n 个整数。132 模式的子序列 由三个整数 nums[i]、nums[j] 和 nums[k] 组成,并同时满足:i < j < k 和 nums[i] < nums[k] < nums[j] 。问是否有这样的子序列
解法
1.线段树:一开始想的是先从左到右查每个位置左边的最小数是多少,然后从右到左维护一个线段树查比当前位置小的最大值,可是既要离散化,而且代码量太大,题目暗示了有o(n)的解法,所以就放弃没写
2.单调栈:仔细想了想后发现我只要从右到左维护一个单调递减的单调栈,弹出去的元素中的最大值比遍历到的当前位置大,就一定有符合模式的子序列,因为我们可以把弹出去的最大的元素看做是k,既然k是被弹出去的,那么一定有在其左边的比他大的其他元素j,那么当前位置i只要比k位置的数小就行了
写一写代码熟悉一下java中stack的用法

class Solution {
    public boolean find132pattern(int[] nums) {
       Stack<Integer> s = new Stack<Integer>();
       int maxx=-1000000000-10;
       int flag=0;
       s.push(nums.length-1);
       for(int i=nums.length-2;i>=0;i--){
            while(s.size()!=0&&nums[i]>nums[s.peek()]){
               if(nums[s.peek()]>maxx) maxx=nums[s.peek()];
               s.pop();
            }
            if(s.size()>0&&maxx>nums[i]){

                flag=1;
            }
            s.push(i);
       }
       if(flag==1) return true;
       else return false;
    }
}