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 };

浙公网安备 33010602011771号