Given a sequence of n integers a1, a2, ..., an, a 132
pattern is a subsequence ai, aj, ak such that i
< j
< k
and ai
< ak
< aj
. Design an algorithm that takes a list of n numbers as input and checks whether there is a 132 pattern in the list.
n
will be less than 20,000
.
样例
Given nums = [1, 2, 3, 4]
return False
// There is no 132 pattern in the sequence.
Given nums = [3, 1, 4, 2]
return True
// There is a 132 pattern in the sequence: [1, 4, 2].
蛮力搜索找出 3 个合乎条件的数复杂度是 n 的 3 次方,运行超时。优化为保存一个数之前可能形成 132 模式的几组最大最小数,判断这个数否在这个几组最大最小数之间。
class Solution {
public:
/**
* @param nums a list of n integers
* @return true if there is a 132 pattern or false
*/
bool find132pattern(vector<int>& nums) {
// Write your code here
if(nums.size() < 3) return false;
vector<int> stack;
stack.push_back(nums[0]); stack.push_back(nums[1]);
for(int i = 0; i < nums.size(); ++i) {
int cur = nums[i];
for(int j = 0; j < stack.size(); j += 2) {
if(cur > stack[j] && cur < stack[j + 1]) {
return true;
}
if(cur > stack[j + 1]) {
stack[j + 1] = cur;
}
}
if(cur < stack[stack.size() - 2]) {
stack.push_back(cur); stack.push_back(cur);
}
}
return false;
}
};