132 C ++模式

假设我们有一个由n个整数a1,a2,...,an组成的序列,其中132个模式是子序列ai,aj,ak,使得i <j <k和ai <ak <aj。因此,我们必须设计一种算法,将n个数字的列表作为输入并检查列表中是否存在132个模式。因此,例如,如果输入类似于[-1、3、2、0],则输出为true,因为存在三种模式[-1、3、2],[-1、3、0]和[-1,2,0]。

为了解决这个问题,我们将遵循以下步骤-

  • n:= nums的大小,如果n为0,则返回false

  • 定义一个大小为n的名为minVals的数组,设置minVals [0]:= nums [0]

  • 对于I范围从1到n – 1

    • minVals [i]:= minVals [i-1]和nums [i]的最小值

  • 创建堆栈st

  • 因为我的范围是n – 1至1

    • 从堆栈st删除

    • minVal:= minVals [i – 1]

    • curr:= nums [j]

    • 当st不为空并且栈顶为<= minVal

    • 如果st不为空并且栈顶<curr,则返回true

    • 在s中插入nums [i]

  • 返回假

范例(C ++)

让我们看下面的实现以更好地理解-

->

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   bool find132pattern(vector<int>& nums) {
      int n = nums.size();
      if(!n) return false;
      vector <int> minVals(n);
      minVals[0] = nums[0];
      for(int i = 1; i < n; i++){
         minVals[i] = min(minVals[i - 1], nums[i]);
      }
      stack <int> s;
      for(int i = n - 1; i > 0; i--){
         int minVal = minVals[i - 1];
         int curr = nums[i];
         while(!s.empty() && s.top() <= minVal) s.pop();
         if(!s.empty() && s.top() < curr) return true;
         s.push(nums[i]);
      }
      return false;
   }
};
main(){
   vector<int> v = {-1,3,2,0};
   Solution ob;
   cout << (ob.find132pattern(v));
}

输入值

[-1,3,2,0]

输出结果

1