【leetcode】456. 132 模式 单调栈出栈特性

该文章介绍了一种利用单调栈解决数组中找到大于左右元素波峰的算法。通过从数组末尾向前遍历,利用栈的特性判断元素关系,找到满足条件的序列i<j<k且nums[i]<nums[k]<nums[j]。当遇到nums[i]小于栈中最大元素时,即可返回true,否则继续遍历直至结束返回false。

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

在这里插入图片描述
看题意是要在数组中找到一个大于左右元素波峰。

一开始看数据量是 10e5,还以为是 nlogn算法。没想到居然是个 n 的单调栈。

这道题利用了递减单调栈出栈的特性, 出栈元素 k、栈中某一个特定元素 j 满足 nums[j] > nums[k],如果从数组后面向前遍历的话,则有 j < k 同时 nums[j] > nums[k]。

很好理解 因为让 k 出栈的元素 一定是比 k 要大的一个元素。

接下来只要找到 题目中 i 中,就可以返回 true。

维护一个 max 变量作为在出栈元素中最大一个。

向前遍历时,只要 nums[i] < max 这个变量,就找到了 i < j < k, 同时 nums[i] < nums[k] < nums[j]

    public boolean find132pattern(int[] nums) {
        int k = Integer.MIN_VALUE;
        Stack<Integer> stack = new Stack<>();
        for(int i = nums.length - 1; i >= 0; i--) {
            if(nums[i] < k) {
                return true;
            }
            if(stack.isEmpty()) {
                stack.add(nums[i]);
            } else {
                while(!stack.isEmpty() && stack.peek() < nums[i]) {
                    k = Math.max(k, stack.pop());
                }
                stack.add(nums[i]);
            }
        }
        return false;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值