zoukankan      html  css  js  c++  java
  • 456. 132模式

    给定一个整数序列:a1, a2, ..., an,一个132模式的子序列 ai, aj, ak 被定义为:当 i < j < k 时,ai < ak < aj。设计一个算法,当给定有 n 个数字的序列时,验证这个序列中是否含有132模式的子序列。
    注意:n 的值小于15000。
    示例1:
    输入: [1, 2, 3, 4]
    输出: False
    解释: 序列中不存在132模式的子序列。
    示例 2:
    输入: [3, 1, 4, 2]
    输出: True
    解释: 序列中有 1 个132模式的子序列: [1, 4, 2].
    示例 3:
    输入: [-1, 3, 2, 0]
    输出: True
    解释: 序列中有 3 个132模式的的子序列: [-1, 3, 2], [-1, 3, 0] 和 [-1, 2, 0].

    这个问题有3种解法。
    (1)一种3层循环遍历的,不解释了,太简单
    (2)一种是O(n^2)时间复杂度的
    (3)最后一种是单调栈实现的,直接上一个大神的代码,取自于 我是连接

    class Solution {
    public:
        bool find132pattern(vector<int>& nums) {
            int third = INT_MIN;
            stack<int> st;
            for (int i = nums.size() - 1; i >= 0; --i) {
                if (nums[i] < third) return true;
                while (!st.empty() && nums[i] > st.top()) {
                    third = st.top(); st.pop();
                }
                st.push(nums[i]);
            }
            return false;
        }
    };
    
    

    直接解释第三种解法,因为网上的人对这个解法都没解释清楚,我也想了一天想举反例,但是到最后还是没能找到反例反驳,后来想想他的思路,主要是你得知道他为何要维护这个单调栈。
    先直接上上面那个链接的大神的解析:

    思路是:

    我们维护一个栈和一个变量 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 值小这个条件,举个例子来说吧,比如 [2, 4, 2, 3, 5],由于是从后往前遍历,所以后三个数都不会进入 while 循环,那么栈中的数字为 5, 3, 2(其中2为栈顶元素),此时 third 还是整型最小,那么当遍历到4的时候,终于4大于栈顶元素2了,那么 third 赋值为2,且2出栈。此时继续 while 循环,因为4还是大于新栈顶元素3,此时 third 赋值为3,且3出栈。现在栈顶元素是5,那么 while 循环结束,将4压入栈。下一个数字2,小于 third,则找到符合要求的序列 [2, 4, 3]

    (未完待续,将分情况进行深入探讨)
    参考连接:Grandyang 挺喜欢他的解析的,一直在看他的,大家可以学习一下

  • 相关阅读:
    SDN课程阅读作业(2)
    2019 SDN上机第5次作业
    第01组 Alpha事后诸葛亮
    Windows 7 64位安装cURL
    html 空白汉字占位符&#12288;
    申请一个免费美国手机号码
    搭建网站需要学习什么(转自知乎)
    Eclipse 项目有红感叹号
    CSS字体大小之em,px,百分比
    题目1013:开门人和关门人
  • 原文地址:https://www.cnblogs.com/disandafeier/p/10933252.html
Copyright © 2011-2022 走看看