456. 132 模式

93 阅读1分钟

题目:
给你一个整数数组 nums ,数组中共有 n 个整数。132 模式的子序列 由三个整数 nums[i]nums[j] 和 nums[k] 组成,并同时满足:i < j < k 和 nums[i] < nums[k] < nums[j] 。

如果 nums 中存在 132 模式的子序列 ,返回 true ;否则,返回 false 。

算法:
方法一:单调栈
对nums从后往前遍历维护一个从栈底->栈顶 递减的单调栈,以及maxK,maxK表示被从栈中弹出(找到了一个j < k, nums[k]<nums[j]就弹出,然后nums[j]入栈)的最大k。
如果存在nums[i] < maxK说明找到了i。此时,nums[i],numsj,max_k构成了132子序列

func find132pattern(nums []int) bool {
    stack := make([]int, 0)
    maxK := math.MinInt32
    for i := len(nums) - 1; i >= 0; i-- {
        for len(stack) != 0 && stack[len(stack) - 1] < nums[i]{
            // 等于不能弹出,因为maxK意味着找到了j<k,且nums[j] > nums[k]才弹出k
            // 为什么是maxK不是minK呢,比被弹出的最大的k还要小,最容易满足132(maxK包含了minK时满足条件的i)
            maxK = max(stack[len(stack) - 1], maxK)
            stack = stack[:len(stack) - 1]
            
        }
        stack = append(stack, nums[i])
        if nums[i] < maxK {
            return true
        }
    }
    return false
}

func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}