LeetCode讲解篇之456. 132 模式

题目描述

在这里插入图片描述

题解思路

这题需要我们尝试找到三个数,假设三个数的下标分别是i,j,k,需要满足条件:i < j < k && nums[i] < nums[k] < nums[j]
这类型的题目我们一般尝试使用控制变量法,针对这题我们可以将 j 和 k 控制住,用一个最大的 k 来表示,那么我们这题就转化为是否能找到三个数满足条件:i < maxK && nums[i] < nums[maxK]
对于maxK,我们可以使用单调栈求解

题解代码

func find132pattern(nums []int) bool {
    n := len(nums)
    // 从栈顶到栈底单调递增的单调栈
    st := []int{nums[n - 1]}
    maxK := math.MinInt

	// 倒序遍历
    for i := n - 2; i >= 0; i-- {
        if nums[i] < maxK {
        	// 满足条件:i < maxK && nums[i] < nums[maxK]
            return true
        }

        // 维护单调栈,并且尝试更新maxK
        for len(st) > 0 && nums[i] > st[len(st) - 1] {
            maxK = max(maxK, st[len(st) - 1])
            st = st[:len(st) - 1]
        }
        st = append(st, nums[i])
    }

	// 不存在满足条件:i < maxK && nums[i] < nums[maxK] 的情况
    return false
}

题目链接

https://leetcode.cn/problems/132-pattern/description/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

醉墨居士

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

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

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

打赏作者

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

抵扣说明:

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

余额充值