题目链接:https://leetcode-cn.com/problems/132-pattern/
思路:先递推mn数组,mn[i]表示前i个数最小的数 再从后往前遍历,对于每个i,栈内维护大于当前mn[i]的数,因此对于当前i,栈内的数字保证了前面可以找到1,当前i是3,只要栈内的数小于当前3,便是2了。
因为栈内的数字一定小于mn[i],mn数组从后往前遍历是单调递增的,栈内的数如果大于nums[i]就会return了 所以栈内的数一定是单调递增的。
代码
class Solution {
int mn[15010];
stack<int> st;
public:
bool find132pattern(vector<int>& nums) {
mn[0]=nums[0];
if(nums.size()<3)
return false;
for(int i=1;i<nums.size();i++)
{
mn[i]=min(mn[i-1],nums[i]);
}
for(int j=nums.size()-1;j>=0;j--)
{
while(st.size()&&st.top()<=mn[j])
{
st.pop();
}
if(st.size()&&nums[j]>st.top())
{
return true;
}
st.push(nums[j]);
}
return false;
}
};