单调栈
栈中的元素都是单调的,本题的关键就是k,从后往前遍历数组i,a[k]的数值必须大于a[i],并且在i~k中存在一个元素大于a[k]。因此选用单调栈。
单调栈中维护的是不符合上述条件的k,每次遍历到新的i时查看单调栈中,比a[i]小的元素,并将其弹出,然后将自身放入栈中,同时记录弹出的值中最大的元素,因为弹出的这些元素保证前面有一个元素大于它,且下标小于它。所以每次遍历到新的a[i]时就判断当前a[i]是否小于k,如果满足就说明找到了“132”模式的值。
class Solution {
public:
bool find132pattern(vector<int>& nums) {
stack<int> stk;
int k = INT_MIN;
for (int i = nums.size()-1; i >= 0; --i){
if (nums[i] < k) return true;
while(stk.size() && stk.top() < nums[i]){
if (stk.top() > k)
k = stk.top();
stk.pop();
}
stk.push(nums[i]);
}
return false;
}
};