2021.05.22单调栈解决132模式

这篇文章详细解析了如何利用单调栈的技巧解决LeetCode上的132模式问题,通过从右到左遍历数组,维护模式3(单调递增栈)并更新模式2(最大值),确保找到模式1(满足i<j<k且nums[i]<nums[k]<nums[j])。适合理解栈在模式匹配中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2021.05.22单调栈解决132模式

( 题目来源:https://leetcode-cn.com/problems/132-pattern/ )

题目描述

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

思路

  1. 考虑从右往左遍历数组。
  2. 要点:
    (1)记录模式2
    (2)维护一个单调栈,记录模式3
    (3)为了找到模式1,我们只需要将新元素和模式2的数字进行比较,如果新元素比模式2还要大,那么他应该放入单调栈中。
    (4)为了方便找到模式1,我们需要在遍历过程中不断更新模式2,使其尽可能大。而更新模式2的步骤就是(3)中的更新单调栈操作。由于单调找中存的都是历史的模式3,所以如果新进入的元素比原始单调栈总的元素大,那么被挤出去的模式3数将更新模式2.(所谓瘦死的骆驼比马大)

代码

	public boolean find132pattern(int[] nums) {
		int n = nums.length;
		if(n < 3) return false;
		//单调栈,栈顶元素为小元素
		Stack<Integer> sta = new Stack<>();
		int las = Integer.MIN_VALUE;
		for(int i = n-1; i >= 0; i++) {
			//在模式"132"中,如果当前的数字,即1,比las的2要小,那么返回true
			if(nums[i] > las) return true;
			
			//如果新进来的比2打,即满足模式"332",那么更新2为3
			while(!sta.isEmpty() && sta.peek() < nums[i]) { //如果新进入的元素比栈顶元素大,即可以将sta中记录的3模式的一个数组挤到2模式中去
				las = sta.pop();
			}
			sta.push(nums[i]);
		}
		return false;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值