- 时间复杂度nlogn:
我们可以:对于每个i作为132模式中的3,i前面数字的最小值为x,看是否存在[i,n-1]中的数字在[x,nums[i]]之间。如何查看呢,可以先正序一遍求出每个i前面数字的最小值mi[i],然后倒序遍历,后面的放在一个set里,直接lower_bound,upper_bound。 - 单调栈还可以找到:对于每个值找到后面小于他的最大值)。
所以假如i是132中的1,就需要看一下i后面的每个值x对应后面小于x的最大值y,一堆y里面的最大值second,假如nums[i]<second就说明存在132模式。
i后面不存在比nums[i]小的数,便不会入栈比较(废话)
class Solution {
#define INF 0x3f3f3f3f
public:
bool find132pattern(vector<int>& nums) {
int n=nums.size();
if(n<3) return false;
int second=-INF;
stack<int>s;s.push(nums[n-1]);
for(int i=n-2;i>=0;--i){//i作为1 second作为2 i比second小了,i一定比3小
if(nums[i]<second) return true;//找到i后面小于nums[i]的最大值,看是否可以更新second
while(!s.empty()&&s.top()<nums[i]) second=max(second,s.top()),s.pop();
s.push(nums[i]);
}
return false;
}
};