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;
    }
}

 

posted @ 2020-10-29 14:13  fatttcat  阅读(118)  评论(0编辑  收藏  举报