描述
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.
解题代码
public class Solution {
/**
* @param nums a list of n integers
* @return true if there is a 132 pattern or false
*/
public boolean find132pattern(int[] nums) {
// Write your code here
int n = nums.length;
int i=0,j=0,k=0;
int third = Integer.MIN_VALUE;
Stack<Integer> s = new Stack<Integer>();
if(n < 3)
return false;
for(i=n-1;i>=0;i--){
if(nums[i] < third)
return true;
else
//second值和third值越接近越优
while(!s.empty() && nums[i] > s.peek()){
third = s.pop();
}
s.push(nums[i]);
}
return false;
}
}
笔记/思路
stack s里面维持的是一个(从栈顶到栈底)升序的排列,越往栈底,越接近数组尾部。也就是说,栈顶存的是栈中最小的值。
可以理解为栈中存储的是“132”中的预备“2”值。
从后向前 遍历数组,每当有值大于栈顶的值,那么就满足“132”模式中的“32”,弹出“2”,保存在变量third(第三个值)中,下一次循环如果当前值小于“2”值,那么就满足“132”的“1”了,这样就完成了查找“132”值。