456. 132 Pattern - Medium
Given an array of n
integers nums
, a 132 pattern is a subsequence of three integers nums[i]
, nums[j]
and nums[k]
such that i < j < k
and nums[i] < nums[k] < nums[j]
.
Return true
if there is a 132 pattern in nums
, otherwise, return false
.
Follow up: The O(n^2)
is trivial, could you come up with the O(n logn)
or the O(n)
solution?
Example 1:
Input: nums = [1,2,3,4] Output: false Explanation: There is no 132 pattern in the sequence.
Example 2:
Input: nums = [3,1,4,2] Output: true Explanation: There is a 132 pattern in the sequence: [1, 4, 2].
Example 3:
Input: nums = [-1,3,2,0] Output: true Explanation: There are three 132 patterns in the sequence: [-1, 3, 2], [-1, 3, 0] and [-1, 2, 0].
Constraints:
n == nums.length
1 <= n <= 104
-109 <= nums[i] <= 109
maintain a stack and a variable third (2 in 132 pattern)
stack stores all numbers larger than third (3 in 132 pattern)
when we iterate the array, and current number is less than third,
then we found the 1 in 132 pattern, return true
time = O(n), space = O(n) worst case
class Solution { public boolean find132pattern(int[] nums) { int third = Integer.MIN_VALUE; // 2 in 132 pattern Deque<Integer> stack = new ArrayDeque<>(); // keep track of 3 in 132 pattern for(int i = nums.length - 1; i >= 0; i--) { if(nums[i] < third) { // find 1 in 132 pattern return true; } while(!stack.isEmpty() && nums[i] > stack.peek()) { third = stack.pop(); } stack.push(nums[i]); } return false; } }