456. 132 Pattern

仅供自己学习

 

思路:

以3为中心,判断1和2。

首先判断nums的长度是否大于3,否则直接返回false。我们用一个multiset,可以按照升序排序,并且可根据upper_bound找到大于传入参数的第一个元素的位置,便于遍历寻找适合2标号的元素。

首先我们用一个变量left_min存放1,然后将第三个元素开始放入multiset容器中。然后开始从第二个元素遍历,这样就分配好了三段。

我们现在是以 3标号进行遍历,首先判断是否大于left_min,如果小于,那么就判断left_min和nums[i]谁更小就用小的作为新的left_min。然后将multiset的nums[i+1]去掉,这是因为我们的3标号要遍历到nums[i+1]这个元素了,那么这个元素就不能加入到存放3标号右侧的元素集合里面。如果满足这个元素大于left_min,那么就将left_min传入upper_bound,查找大于1标号的元素的第一个元素,也是最小的大于left_min的元素,如果这个元素小于 3标号的元素,那么就return true,否则这个3标号的元素不够大,没有满足条件2标号的元素,所以只能只能遍历到下一个nums元素,所以再次执行更新left_min和去掉multiset的3标号下次准备用的元素。

代码:

 1 class Solution {
 2 public:
 3     bool find132pattern(vector<int>& nums) {
 4         int n=nums.size();
 5         if(n<3) return false;
 6         int left_min=nums[0];
 7         multiset<int> right_all;
 8         for(int i=2;i<n;++i){
 9             right_all.insert(nums[i]);
10         }
11         for(int i=1;i<n-1;++i){
12             if(nums[i]>left_min){
13                 auto it=right_all.upper_bound(left_min);
14                 if(it!=right_all.end()&&*it<nums[i]) return true;
15             }
16             left_min=min(left_min,nums[i]);
17             right_all.erase(right_all.find(nums[i+1]));
18         }
19         return false;
20     }
21 };

 

posted @ 2021-03-24 21:22  Mrsdwang  阅读(18)  评论(0)    收藏  举报