LeetCode 456
132 Pattern
Problem Description:
给出一组数字,找出里面是否存在“132”模式,即左边的数字是三个数里面最小的,中间的数字是三个数里面最大的,右边的数字是三个数里面排第二大(小)的。需要注意的是,这三个数字不一定连续(废话!谁像你一样没看好题目==)
具体的题目信息:
https://leetcode.com/problems/132-pattern/description/Solution:
【解法一】
在对题目条件考虑不足的情况下写的,导致后面根据测试样例改的很凌乱。虽然Accepted了,但是不可取,继续加油吧~
class Solution {
public:
bool find132pattern(vector<int>& nums) {
if (nums.size()<3)
return false;
stack<int> result;
result.push(nums[0]);
int topnum;
int flag = 0;
int start = 0;
int j = 2;
int position;
for (int i = 1; i < nums.size(),j<nums.size(); ) {
if (nums[i]>result.top()) {
topnum = result.top();
result.push(nums[i]);
while(j < nums.size()) {
if (nums[j]>topnum&&nums[j]<result.top()) {
return true;
}
j++;
}
result.pop();
if (flag == 0) {
//result.push(nums[i]);
i++;
j=i+1;
continue;
} else {
while(!result.empty())
result.pop();
result.push(start);
flag = 0;
i = position+1;
j = i+1;
continue;
}
} else {
if (flag == 0) {
flag = 1;
start = nums[i];
position = i;
}
if(i == nums.size()-2) {
while(!result.empty())
result.pop();
result.push(start);
flag = 0;
i = position;
}
i++;
j = i+1;
}
}
return false;
}
};
【解法二】这才是这道题目用栈来解答的正确方式
用栈来存储:栈中存放所有不大于栈底元素的值,且从栈顶开始依次递增存储。当栈顶元素小于nums[i],继续往后遍历找小于nums[i]的数,以确定num[i]后的第二个最大值,从而确定对最小值的约束(只要存在一个比temp小的数即可)。
简单地说,就是temp变量来存储位于最大值右侧的第二大值,在最大值左侧遍历,如果找到一个值比temp小,即满足“132”模式,否则不满足。
class Solution {
public:
bool find132pattern(vector<int>& nums) {
int temp = INT_MIN;
stack<int> maxnum;
for (int i = nums.size()-1; i >= 0; i--) {
if (nums[i]<temp)
return true;
while(!maxnum.empty()&&nums[i]>maxnum.top()) {
temp = maxnum.top();
maxnum.pop();
}
maxnum.push(nums[i]);
}
return false;
}
};