class Solution { public: bool find132pattern(vector<int>& nums) { int s3=INT_MIN; if(nums.size()<3)return false; vector<int> stack; for(int i=nums.size()-1;i>=0;--i) { if(nums[i]<s3)return true; else while(!stack.empty()&&nums[i]>stack.back()) { s3=stack.back(); stack.pop_back(); } stack.push_back(nums[i]); } return false; } };
1
初看还以为挺简单, 当然我也整出一个办法, 就是遍历元素, 用set来排序, 每遍历到新元素,就判断set里面有没有比它大和比他小的元素然后判断下索引, 当然这办法太复杂了, 不高效
2
然后我就去discussion里面看答案, 果然是不得了 On的空间复杂度和时间复杂度.
3
作者说左边遍历或者右边遍历都可以,但是我是没搞定如果从左边遍历该怎么搞.
由于连续三个递增的索引 abc, 要做到对应的值Va < Vc < Vb, 把a作为一组看, bc作为一组看;
先简化下, 如果只让找出 Va<Vb, 是不是就很简单了, 这里把bc绑定在一起, 从右边向左遍历, 找出最大值和第二大的值设为bc就好了
4
使用栈或者说vector的目的就是为了保证元素顺序, s3变量代表的含义是Vc, 也就是 abc里面第三个元素, 索引最大, 但是值是第二大的, Vb值是最大的,永远位于vector中