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.
Note: n will be less than 15,000.
Example 1:
Input: [1, 2, 3, 4] Output: False Explanation: There is no 132 pattern in the sequence.
Example 2:
Input: [3, 1, 4, 2] Output: True Explanation: There is a 132 pattern in the sequence: [1, 4, 2].
Example 3:
Input: [-1, 3, 2, 0] Output: True Explanation: There are three 132 patterns in the sequence: [-1, 3, 2], [-1, 3, 0] and [-1, 2, 0].
Subscribe to see which companies asked this question.
对于每一个索引i,我们将找出最左边的索引j,以便索引中的数字大于它,看看是否存在索引k,其中索引k的个数小于索引I的个数,
我们维护一个数组DP,它将关闭索引存储在左边,这样就使得构建这个DP数组的任何索引中的数字都是O(n)。
class Solution {
public:
bool find132pattern(vector<int>& nums) {
int i,j,k,n;
n = nums.size();
if(n<3)
return false;
vector<int> mn(nums.begin(),nums.end());
for(i=1;i<n;i++)
mn[i] = min(mn[i],mn[i-1]);
int dp[n]{-1};
for(i=0;i<n;i++)
{
j = i-1;
while(j!= -1 && nums[j]<=nums[i])
j = dp[j];
dp[i] = j;
}
for(i=2;i<n;i++)
{
j = dp[i];
if(j>0 && mn[j-1]<nums[i])
return true;
}
return false;
}
};