LC 456. 132模式

题目描述

给定一个整数序列:a1, a2, …, an,一个132模式的子序列 ai, aj, ak 被定义为:当 i < j < k 时,ai < ak < aj。设计一个算法,当给定有 n 个数字的序列时,验证这个序列中是否含有132模式的子序列。

注意:n 的值小于15000。

样例
example1:

输入: [1, 2, 3, 4]

输出: False

解释: 序列中不存在132模式的子序列。

example2:

输入: [3, 1, 4, 2]

输出: True

解释: 序列中有 1 个132模式的子序列: [1, 4, 2].


算法

(非典型)单调栈

我们的目的是找到:ai、aj、ak,使得aj > ak > ai

从后向前枚举,维护一个单调递减的栈,相当于从前向后单调递增的栈,栈顶元素相当于我们要找的aj,增加一个辅助变量right记录下当前从右向左出现过的,比栈顶元素小的所有元素的最大值(即我们要找的ak)

当枚举到nums[i]发现nums[i] < right,即说明成立

时间复杂度

O ( n ) O(n) O(n)

C++ 代码
class Solution {
public:
    stack<int> stk;

    bool find132pattern(vector<int>& nums) {
        int right = INT_MIN;
        for (int i = nums.size() - 1; i >= 0; i -- ) {
            if (nums[i] < right) return true;

            while (stk.size() && nums[i] > stk.top()) {
                right = max(stk.top(), right);
                stk.pop();
            }
            stk.push(nums[i]);
        }
        return false;
        
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水能zai舟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值