456.132模式
题目详情
给你一个整数数组nums,数组中共有n个整数。132模式的子序列由三个整数nums[i]、nums[j]、nums[k]组成,并同时满足i<j<k且nums[i]<nums[k]<nums[j]。
如果nums中存在132模式的子序列,返回true;否则,返回false
提示
n == nums.length;
1 <= n <= 10^4;
10^9 <= nums[i] <= 10^9
进阶
很容易想到时间复杂度为O(n^2)的解决方案,你可以设计一个时间复杂度为O(n logn)或O(n)的解决方案吗?
1.暴力解法
双循环,维护中间数mid(3),三个指针。
因为只是返回true或false,所以如果先出现比现有mid大的就直接替换mid。例如[1,5,6,3]这种情况,循环到6时将mid由5替换成6即可。
存在一个132子序列直接返回true。
public class LCode456 {
public static void main(String[] args) {
int[] nums = {1, 5, 3, 4};
System.out.println(find132pattern(nums));
}
public static boolean find132pattern(int[] nums) {
if (nums.length < 3) {
return false;
}
for (int i = 0; i < nums.length; i++) {
int left=nums[i];
int mid = left;
for (int j = i; j <nums.length ; j++) {
if(nums[j]>mid){
mid=nums[j];
continue;
}
if(mid!=left&&nums[j]>left&&nums[j]<mid){
return true;
}
}
}
return false;
}
}
等有时间研究一下O(n logn)或O(n)的解决方案,需要用到单调栈的相关知识(知识盲区),枚举1或枚举3或枚举2.