题目链接:leetcode.
小破题把孩子整不会了都
/*
93 / 101 个通过测试用例
[3,5,0,3,4]
*/
class Solution {
public:
bool find132pattern(vector<int>& nums) {
if(nums.size() < 3)
return false;
int minn = INT_MAX;
int maxx = INT_MIN;
for(auto x : nums)
{
if(x < maxx && x > minn)
return true;
else if(x < minn)
{
minn = x;
maxx = x;
}
else
maxx = max(x, maxx);
}
return false;
}
};
O(n^2) 枚举nums[j]
,维护 j
左边最小的数,内循环里枚举j
右边的数,看是否符合条件
/*
执行用时:720 ms, 在所有 C++ 提交中击败了7.63%的用户
内存消耗:12.9 MB, 在所有 C++ 提交中击败了97.03%的用户
*/
class Solution {
public:
bool find132pattern(vector<int>& nums) {
if(nums.size() < 3)
return false;
int N = nums.size();
int minn = nums[0];
for(int j = 1;j < N - 1;++j)
{
if(nums[j] > minn)
{
for(int k = j + 1;k < N;++k)
{
if(nums[k] < nums[j] && nums[k] > minn)
return true;
}
}
minn = min(minn, nums[j]);
}
return false;
}
};
O(n) O(n)
从右向左遍历,单调栈维护已经遍历过的数字,作为"2"的候选,对于每一个新来的数,看它是否能作为"3"
如果新来的数比栈顶大,那么可以作为"3",弹出栈顶,如果这个"2"比"1"大,找到了132,返回true;否则,弹出栈顶,看下一个"2"是否比"1"大
(提前维护一个数组记录每个数左边最小的数,作为"1")
如果新来的数比栈顶小,就将他压栈,继续作为"2"的候选
/*
执行用时:16 ms, 在所有 C++ 提交中击败了69.77%的用户
内存消耗:13.7 MB, 在所有 C++ 提交中击败了30.37%的用户
*/
class Solution {
public:
bool find132pattern(vector<int>& nums) {
if(nums.size() < 3)
return false;
int N = nums.size();
//记录 "1"
vector<int> minn(n, INT_MAX);
for(int i = 1;i < N;++i)
{
minn[i] = min(nums[i - 1], minn[i - 1]);
}
stack<int> S;
S.push(nums[N - 1]);
for(int i = N - 2;i >= 0;--i)
{
while(!S.empty() && nums[i] > S.top())
{
if(S.top() > minn[i])
return true;
S.pop();
}
S.push(nums[i]);
}
return false;
}
};