1 class Solution { 2 public: 3 bool find132pattern(vector<int>& nums) { 4 stack<int> st; 5 int s3=INT_MIN; 6 for(int i=nums.size()-1;i>=0;--i) //逆序循环,因为s1必须是最小;方便下面判断s1<s3 7 { 8 if(nums[i]<s3) return true; //如果正向循环, 就得判断s3在中间 9 else while(!st.empty()&&nums[i]>st.top()) //保证stack入栈顺序是越来越小;如果有比top大的则依次取出作为s3,直到大于nums[i] 10 { 11 s3=st.top(); 12 st.pop(); 13 } 14 st.push(nums[i]); 15 } 16 return false; 17 } 18 };
索引 i<j<k; 值分别为s1,s2,s3.
要求值 s1<s3<s2; s1最小s3最大;
逆序循环是为了最后只判断s1是最小即可; 否则你就要判断s3, s3是中间值,有点麻烦;
作者说是O(N)的space&time ; 但是这里有stack的操作,看起来并不是严格意义上的O(N)吧. 不知道是我理解对不对.