456. 132 Pattern

class Solution {
public:
    bool find132pattern(vector<int>& nums) {
        int s3=INT_MIN;
        if(nums.size()<3)return false;
        vector<int> stack;
        for(int i=nums.size()-1;i>=0;--i)
        {
            if(nums[i]<s3)return true;
            else while(!stack.empty()&&nums[i]>stack.back())
            {
                s3=stack.back();
                stack.pop_back();
            }
            stack.push_back(nums[i]);
        }
        return false;
    }
};

1

初看还以为挺简单, 当然我也整出一个办法, 就是遍历元素, 用set来排序, 每遍历到新元素,就判断set里面有没有比它大和比他小的元素然后判断下索引, 当然这办法太复杂了, 不高效

2

然后我就去discussion里面看答案, 果然是不得了 On的空间复杂度和时间复杂度.

3

作者说左边遍历或者右边遍历都可以,但是我是没搞定如果从左边遍历该怎么搞.

由于连续三个递增的索引 abc, 要做到对应的值Va < Vc < Vb,  把a作为一组看,  bc作为一组看; 

先简化下, 如果只让找出  Va<Vb,  是不是就很简单了, 这里把bc绑定在一起, 从右边向左遍历, 找出最大值和第二大的值设为bc就好了

4

使用栈或者说vector的目的就是为了保证元素顺序, s3变量代表的含义是Vc, 也就是 abc里面第三个元素, 索引最大, 但是值是第二大的, Vb值是最大的,永远位于vector中

猜你喜欢

转载自www.cnblogs.com/lychnis/p/9281625.html