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)吧. 不知道是我理解对不对.

02-12 17:22