思路:维护一个单调栈,存放最大值,再维护一个变量存放第二大值,从后往前遍历数组,当有元素小于第二大值时返回真。其中单调栈相当于维护了132
中的3
,而第二大值则维护了2
,再往前找一个1
就行了。
class Solution {
public:
bool find132pattern(vector<int>& nums) {
int n = nums.size();
if (n < 3) return false;
stack<int> max_val;
int sec_max_val = INT_MIN; //第二大值初始化为无穷小
for (int i = n - 1; ~i; i -- )
{
if (nums[i] < sec_max_val) return true;
//栈不为空且栈顶元素小于当前元素时,将栈顶元素替换为当前元素
while (max_val.size() && nums[i] > max_val.top())
{
sec_max_val = max_val.top(); //第二大元素等于原栈顶元素
max_val.pop();
}
max_val.push(nums[i]); //小于栈顶即符合单调栈性质,入栈
}
return false;
}
};