Leetcode-456-132模式(单调栈)
题目链接
题目描述
数组 nums ,共 n 个整数。
132 模式的子序列 由三个整数 nums[i]、nums[j] 和 nums[k] 组成,
并满足:i < j < k 和 nums[i] < nums[k] < nums[j] 。
如果 nums 中存在 132 模式的子序列 ,返回 true ;否则,返回 false 。
思路
从后遍历数组,维护个单调栈 (s),O(n)..
- 单调栈从 栈顶->栈底 单调增。
- 作为 "2" 的元素要尽可能大,这样才更有可能遇到 "1".
- 用max2记录 "2" 的最大值,max2初始为无穷小。
- 当 nuns[i] > s.top(), 即 nums[i] 可能作为 "3", 把所有可能的 "2" 出栈,并更新 max2.
- 当 nums[i] < max2 时,即构成 "132" 模式的子序列。
C++代码
class Solution {
public:
bool find132pattern(vector<int>& nums) {
stack<int> s;
int len = nums.size();
int max2 = INT_MIN;
s.push(nums[len-1]);
for (int i = len-2; i >= 0; i--) {
if (nums[i] < max2)
return true;
while(!s.empty() && nums[i] > s.top()) {
max2 = max(max2, s.top());
s.pop();
}
s.push(nums[i]);
}
return false;
}
};