题目描述:
解法一:
class Solution {
public:
bool find132pattern(vector<int>& nums) {
int n=nums.size();
if(n<3) return false;
int i=0,j=0,k=0;
while(i<n){
while(i<n-2&&nums[i]>=nums[i+1]) i++; //找到可能的1和3位,然后寻找后面的2
j=i+1;
while(j<n-1&&nums[j]<=nums[j+1]) j++;
k=j+1;
while(k<n){
if(nums[i]<nums[k]&&nums[k]<nums[j])
return true;
k++;
}
i=j+1;
}
return false;
}
};
解法二:
class Solution {
public:
bool find132pattern(vector<int>& nums) {
int n= nums.size();
if(n<3) return false;
stack<int> stk; //递减栈中保存有可能的3
int nextmin=INT_MIN; //2位
for(int i=n-2;i>=0;i--){ //从后向前搜索
if(nums[i]<nextmin) //寻找存在小于2的数
return true;
while(!stk.empty()&&stk.top()<nums[i]){
nextmin=stk.top(); //不断更新最大数3和次大数2
stk.pop();
}
stk.push(nums[i]);
}
return false;
}
};