看题意是要在数组中找到一个大于左右元素波峰。
一开始看数据量是 10e5,还以为是 nlogn算法。没想到居然是个 n 的单调栈。
这道题利用了递减单调栈出栈的特性, 出栈元素 k、栈中某一个特定元素 j 满足 nums[j] > nums[k],如果从数组后面向前遍历的话,则有 j < k 同时 nums[j] > nums[k]。
很好理解 因为让 k 出栈的元素 一定是比 k 要大的一个元素。
接下来只要找到 题目中 i 中,就可以返回 true。
维护一个 max 变量作为在出栈元素中最大一个。
向前遍历时,只要 nums[i] < max 这个变量,就找到了 i < j < k, 同时 nums[i] < nums[k] < nums[j]
public boolean find132pattern(int[] nums) {
int k = Integer.MIN_VALUE;
Stack<Integer> stack = new Stack<>();
for(int i = nums.length - 1; i >= 0; i--) {
if(nums[i] < k) {
return true;
}
if(stack.isEmpty()) {
stack.add(nums[i]);
} else {
while(!stack.isEmpty() && stack.peek() < nums[i]) {
k = Math.max(k, stack.pop());
}
stack.add(nums[i]);
}
}
return false;
}