数组-132模型-中等

描述
给你一个 n 个整数的序列 a1,a2,...,an,一个 132 模式是对于一个子串 ai,aj,ak,满足 i < j < k 和 ai < ak < aj。设计一个算法来检查输入的这 n 个整数的序列中是否存在132模式。
n 会小于 20,000。


您在真实的面试中是否遇到过这个题?  
样例
给你序列 nums = [1,2,3,4]
返回 False//没有132模式在这个序列中。
给你序列 nums = [3,1,4,2]
返回 True//存在132模式:[1,4,2]。

方法一

        这道题给我们了一个数组,让我们找到132的模式,就是第一个数小于第二第三个数,且第三个数小于第二个数。那么我们就按顺序来找这三个数,首先我们来找第一个数,这个数需要最小,那么我们如果发现当前数字大于等于后面一个数字,我们就往下继续遍历,直到当前数字小于下一个数字停止。然后我们找第二个数字,这个数字需要最大,那么如果我们发现当前数字小于等于下一个数字就继续遍历,直到当前数字大雨下一个数字停止。最后就找第三个数字,我们验证这个数字是否在之前两个数字的中间,如果没有找到,我们就从第二个数字的后面一个位置继续开始重新找这三个数字。

方法二

       这种方法利用来栈来做,既简洁又高效,思路是我们维护一个栈和一个变量third,其中third就是第三个数字,也是pattern 132中的2,栈里面按顺序放所有大于third的数字,也是pattern 132中的3,那么我们在遍历的时候,如果当前数字小于third,即pattern 132中的1找到了,我们直接返回true即可,因为已经找到了,注意我们应该从后往前遍历数组。如果当前数字大于栈顶元素,那么我们按顺序将栈顶数字取出,赋值给third,然后将该数字压入栈,这样保证了栈里的元素仍然都是大于third的,我们想要的顺序依旧存在,进一步来说,栈里存放的都是可以维持second > third的second值,其中的任何一个值都是大于当前的third值,如果有更大的值进来,那就等于形成了一个更优的second > third的这样一个组合,并且这时弹出的third值比以前的third值更大,为什么要保证third值更大,因为这样才可以更容易的满足当前的值first比third值小这个条件。

程序


class Solution {
public:
    /**
     * @param nums: a list of n integers
     * @return: true if there is a 132 pattern or false
     */
    bool find132pattern(vector<int> &nums) {
        // write your code here
        /*
        //方法一
        int n = nums.size();
        int i,j,k;
        i = j = k = 0;
        while(i < n){
            while(i < n - 1 && nums[i] >= nums[i + 1])  i++;
            j = i + 1;
            while(j < n - 1 && nums[j] <= nums[j + 1])  j++;
            k = j + 1;
            while(k < n){
                if(nums[k] > nums[i] && nums[k] < nums[j])   return true;
                k++;
            }
            i = j + 1;
        }
        return false;
        */
        
        //方法二
       stack<int> s;
        int third = INT_MIN;
        for(int i = nums.size() - 1; i >= 0; --i){
            if(nums[i] < third) return true;
            else while(!s.empty() && nums[i] > s.top()){
                third = s.top();
                s.pop();
            }
            s.push(nums[i]);
        }
        return false;
    }
};


猜你喜欢

转载自blog.csdn.net/qq_18124075/article/details/80918687
132
今日推荐