- 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;
}
}
确实厉害!慕了