力扣456题解

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

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

进阶:很容易想到时间复杂度为 O(n^2) 的解决方案,你可以设计一个时间复杂度为 O(n logn) 或 O(n) 的解决方案吗?
在这里插入图片描述

很容易可以想到暴力解题的方法,下方是我的代码,很容幸的踩坑超时

public class Main {
	static int []array;
	static boolean flag=false;
	public static void main(String[] args) {
		int []nums= {1,0,1,-4,-3};
		System.out.println(find132pattern(nums));
	}
	 public static boolean find132pattern(int[] nums) {
		 array=nums;
		 return dfs(0);
	 }
	 public static boolean dfs(int n) {
		 if(n==array.length-2) {
			 return false;
		 }
		 for(int i=n+1;i<array.length-1;i++) {
			 if(array[n]<array[i]) {
				 for(int j=i+1;j<array.length;j++) {
					 if(array[i]>array[j]&&array[n]<array[j]) {
						 return true;
					 }
				 }
			 }
		 }
		return dfs(n+1);
	 }
}

再参考力扣no1大佬的题解时顿时顿悟了,下方代码使用单调栈的数据结构,之前未曾见到,真的是学到了

class Solution {
    public boolean find132pattern(int[] nums) {
		if(nums.length<3) {
			System.out.println(false);
			return false;
		}
		//用k记录下每次的代表132模式中2的值
		int n=nums.length,k=Integer.MIN_VALUE,top=-1;//k即代表132中的3
		//这里使用数组模拟栈结构
		int []stack=new int[n];
		//用top来作为维护栈的结构
		//为便于维护132的数据结构的模式,这里便采用倒序的方法
		for(int i=n-1;i>=0;i--) {
			//维护的为单调递减的栈结构,当单调递减栈的结构被破坏时则将破坏之前的元素弹出
			if(k>nums[i]) {
				return true;
			}
			while(top>-1&&stack[top]<nums[i]) {
				k=stack[top];
				top--;
			}
			stack[++top]=nums[i];
		}
        return false;
	 }
}

在这里插入图片描述
确实厉害!慕了

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值