LeetCode.456 132模式

这篇博客介绍了如何解决LeetCode上的132模式问题,通过使用单调栈和数组来优化算法,提高效率。作者详细讲解了思路,包括从右向左扫描数组,维护一个单调栈,以及如何更新right值确保找到合适的mid元素。最终给出了两种解决方案,一种使用栈,另一种用数组实现,展示了如何通过调整数据结构来减少时间开销。

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

原题

https://leetcode-cn.com/problems/132-pattern/
在这里插入图片描述

思路

3个元素 left mid right
left < rightright < midleft < mid
栈(单调栈)
从右向左检索
如果某一元素比栈顶元素大,则将right更新为栈顶元素,以此来保证right一定是比mid小的最大元素
如果当前元素大于right,则将当前元素入栈


如果用数组代替栈,则可以提高效率,减少时间开销

题解

package com.leetcode.code;

import java.util.Deque;
import java.util.LinkedList;
import java.util.Stack;

/**
 * @Description:
 * @ClassName: Code456
 * @Author: ZK
 * @Date: 2021/3/24 00:55
 * @Version: 1.0
 */
public class Code456 {

    public static void main(String[] args) {
        int[] nums = {1,11,10,4,3,2};
        System.out.println(find132pattern2(nums));
    }

//    用栈,9ms
    public static boolean find132pattern(int[] nums) {
        int len = nums.length;
//        定义栈
        Deque<Integer> stack = new LinkedList<>();
//        栈中存放最后一个元素,相当于存了mid
        stack.push(nums[len-1]);
//        默认情况下right为最小值
        int right = Integer.MIN_VALUE;

        for (int i = len-2; i >= 0; i--) {
//            如果当前数字小于right,则return true
            if (nums[i] < right) {
                return true;
            }
//            如果当前元素比栈顶元素大,则将right更新为栈顶元素
//            以此来保证right一定是比mid小的最大元素
            while (!stack.isEmpty() && nums[i] > stack.peek()) {
                right = stack.pop();
            }
//            如果当前元素大于right,则将当前元素入栈
//            下一个元素如果小于right,则return true
//            下一个元素如果大于栈顶元素,则更新right为栈顶元素,则right变大
            if (nums[i] > right) {
                stack.push(nums[i]);
            }
        }

        return false;
    }

//    用数组代替栈,2ms
    public static boolean find132pattern2(int[] nums) {
        int len = nums.length;
//        定义栈
        int[] stack = new int[len];
        int index = 0;
//        栈中存放最后一个元素,相当于存了mid
        stack[index++] = nums[len-1];
//        默认情况下right为最小值
        int right = Integer.MIN_VALUE;

        for (int i = len-2; i >= 0; i--) {
//            如果当前数字小于right,则return true
            if (nums[i] < right) {
                return true;
            }
//            如果当前元素比栈顶元素大,则将right更新为栈顶元素
//            以此来保证right一定是比mid小的最大元素
            while(index>0 && nums[i]>stack[index-1]){
                right = stack[--index];
            }
//            如果当前元素大于right,则将当前元素入栈
//            下一个元素如果小于right,则return true
//            下一个元素如果大于栈顶元素,则更新right为栈顶元素,则right变大
            if (nums[i] > right) {
                stack[index++] = nums[i];
            }
        }

        return false;
    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

难过的风景

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

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

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

打赏作者

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

抵扣说明:

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

余额充值