456. 132 模式

98 阅读1分钟

给你一个整数数组 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]

题解:

/**
 * @param {number[]} nums
 * @return {boolean}
 */
// 方法一:单调栈
// 132模式至少存在三个数字 分别为 min, max, mid
// 遍历数组找 mid 的位置
// 如果当前遍历大于栈顶元素 则栈的单调性被破坏,清空栈 将当前值压入栈底 将栈底元素作为mid
// 此时的当前值为 max
// 如果 mid max 都存在 遍历到 比mid小的值 可放入min位置 返回true
var find132pattern = function (nums) {
    let stack = [], mid = -Infinity
    for (let i = nums.length - 1; i >= 0; i--) {
        if (nums[i] < mid) return true
        while (stack.length > 0 && nums[i] > stack[stack.length - 1]) {
            mid = stack.pop()
        }
        stack.push(nums[i])
    }
    return false
};

来源:力扣(LeetCode)

链接:leetcode.cn/problems/13…

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。