给你一个整数数组 nums ,数组中共有 n 个整数。132 模式的子序列 由三个整数 nums[i]、nums[j] 和 nums[k]组成,并同时满足:i < j < k 和 nums[i] < nums[k] < nums[j] 。
如果 nums 中存在 132模式的子序列 ,返回 true ;否则,返回 false 。
public boolean find132pattern(int[] nums) {
// 使用一个双向队列维持一个单调递减的序列
Deque<Integer> deque = new LinkedList<>();
int j, k = Integer.MIN_VALUE;
// 首先将数组的最后一个元素加入到队列中
deque.push(nums[nums.length - 1]);
for (int i = nums.length - 2; i >= 0; i--) {
/*
当nums[i]<k则表示找到一个nums[i]<nums[k]
由于k是为了保持队列的单调递减而弹出的元素,所以此时队列中必然存在一个元素>k
因此找到了一个这样的序列,使得i<j<k,a[i]<a[k]<a[j]
*/
if (nums[i] < k) {
return true;
}
/*
peek() 返回队列首部元素
如果nums[i]大于队列首部元素,则说明不满足单调递减,将队列首部元素弹出并赋值给k
*/
while (!deque.isEmpty() && nums[i] > deque.peek()) {
k = deque.pop();
}
if (nums[i] > k) {
deque.push(nums[i]);
}
}
return false;
}