首页 > 其他分享 >132 模式 (Medium)

132 模式 (Medium)

时间:2023-02-28 17:02:39浏览次数:56  
标签:Medium third nums 元素 栈顶 模式 stk 132

问题描述

456. 132 模式 (Medium)

给你一个整数数组 nums ,数组中共有 n 个整数。 132 模式的子序列 由三个整数
nums[i]nums[j]nums[k] 组成,并同时满足: i < j < k
nums[i] < nums[k] < nums[j]
如果 nums 中存在 132 模式的子序列 ,返回 true ;否则,返回 false
示例 1:

输入:nums = [1,2,3,4]
输出:false
解释:序列中不存在 132 模式的子序列。

示例 2:

输入:nums = [3,1,4,2]
输出:true
解释:序列中有 1 个 132 模式的子序列: [1, 4, 2] 。

示例 3:

输入:nums = [-1,3,2,0]
输出:true
解释:序列中有 3 个 132 模式的的子序列:[-1, 3, 2]、[-1, 3, 0] 和 [-1, 2, 0] 。

提示:

  • n == nums.length
  • 1 <= n <= 2 * 10⁵
  • -10⁹ <= nums[i] <= 10⁹

解题思路

枚举i,找到符合条件的(j, k),贪心想法,nums[k]必定是满足j > knums[k] < nums[j]的所有nums[k]中最大的一个,因此这里我们采用单调栈来模拟寻找(j, k)的过程,考虑到k > j,这里需要从后往前遍历。

first = nums[i], second = nums[j], third = -INT_MAX,栈为单调递减的(考虑入栈顺序),即栈底到栈顶单调递减,从后往前遍历数组:

  • 如果栈为空,就入栈,不更新third
  • 如果将要入栈的元素大于栈顶元素,那就将栈顶元素弹出(如果栈顶元素大于third,更新third),直到栈为空或者要将入栈的元素小于栈顶元素;
  • 如果将要入栈的元素小于栈顶元素,那么比较该元素和third的大小,如果该元素小于third,说明找到了三元组,否则将该元素入栈

本题的关键我认为有三个,一是想到枚举i(j, k),二是找最大的nums[k],三是从后往前遍历。

代码

class Solution {
  public:
    bool find132pattern(vector<int> &nums) {
        int first = nums[0], second = nums[nums.size() - 1], third = -INT_MAX;
        int i = 0;
        stack<int> stk; // 栈顶到栈底从小到大
        stk.push(nums[nums.size() - 1]);
        for (int r = nums.size() - 2; r >= 0; r--) {
            // 栈应该不可能为空
            if (nums[r] < stk.top()) {
                // if (stk.top() > third) {
                if (nums[r] < third) {
                    return true;
                    // }
                }
                stk.push(nums[r]);
            } else if (nums[r] == stk.top()) {
                stk.push(nums[r]);
            } else {
                while (!stk.empty() && nums[r] > stk.top()) {
                    third = std::max(stk.top(), third);
                    stk.pop();
                }
                stk.push(nums[r]);
            }
        }
        return false;
    }
};

标签:Medium,third,nums,元素,栈顶,模式,stk,132
From: https://www.cnblogs.com/zwyyy456/p/17165075.html

相关文章

  • 1139. 最大的以 1 为边界的正方形 (Medium)
    问题描述1139.最大的以1为边界的正方形(Medium)给你一个由若干0和1组成的二维网格grid,请你找出边界全部由1组成的最大正方形子网格,并返回该子网格中的元素......
  • 1218.最长定差子序列 (Medium)
    问题描述1218.最长定差子序列(Medium)给你一个整数数组arr和一个整数difference,请你找出并返回arr中最长等差子序列的长度,该子序列中相邻元素之间的差等于differ......
  • 334. 递增的三元子序列 (Medium)
    问题描述334.递增的三元子序列(Medium)给你一个整数数组nums,判断这个数组中是否存在长度为3的递增子序列。如果存在这样的三元组下标(i,j,k)且满足i<j<k......
  • 单例设计模式
    单例模式:定义:某个类在某个系统中只能有一个实例化对象被获取和使用实现要点:1.构造器私有2.含有一个该类的静态变量保存这个唯一实例3.对外提供获取该实例对象的方式......
  • 19-命令模式
    19-命令模式概念命令模式(Command),将一个请求封装成一个对象,从而是你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作命令模式作用第一:能......
  • “无所不能的中介”——代理模式
    1.简介定义:将某个对象中围绕某个主题的一些列行为委托给一个代理对象去执行,代理对象将控制和管理对原有对象的访问,调用者想要访问目标对象,必须通过代理对象去间接访问,代......
  • 12. Laravel Passport 授权码模式
    LaravelPassport授权码模式配套视频地址:https://www.bilibili.com/video/av74879198?p=7哔哩哔哩提供一个“微信登陆”的链接,用户点击跳转到微信授权服务器。用户......
  • 11. Laravel Passport 密码模式
    LaravelPassport密码模式配套视频地址:https://www.bilibili.com/video/av74879198?p=5准备工作composercreate-project--prefer-distlaravel/laravellaravel6.......
  • linux重置密码和单用户模式
    CentOS7.9CentOS7系统root密码丢失找回方法(史上最好)1.重新启动或开启CentOS7系统,在选择进入系统Grub菜单界面如下图1-1,根据提示按“e”小写字母进入编辑界面,如下图1-2......
  • 路飞项目:封装日志 全局处理 封装response 数据库配置 软件开发模式 user表配置 开启me
    目录路飞后台配置之封装日志操作步骤:路飞后台配置之封装处理全局异常使用步骤:路飞后台配置之二次封装response使用步骤:路飞数据库配置创建luffy用户mysql的utf8编码和utf8m......