栈-N456-132模式

题目

  • 概述:给定一个整数数组,判断该数组里是否有满足132模式的序列(132模式:序列中的第一个数 < 序列中的第三个数 < 序列中的第二个数)

  • 输入:整数数组,长度范围[0, 15000)

  • 输出:存在132模式的序列返回true,反之返回false

  • 出处:https://leetcode-cn.com/problems/132-pattern/

思路

  • 分解为两个问题:
    1. 寻找逆序对
    2. 逆序对的后一个元素大于从第一个元素到逆序对前一个元素的最小值
  • 遍历整个数组,记录第一个元素到每个元素(不包括)之间的最小值下标Min,同时记录每个元素和之前能和其构成逆序对的元素(最近的一个)下标Rev
  • 记数组为A,当前遍历元素下标为p,上一个遍历元素下标为pBef
    1. A[pBef] == A[p] => NEXT
    2. A[pBef] > A[p] => A[p] > A[Min[pBef]] ? END : NEXT
    3. A[pBef] < A[p] => pBef = Rev[pBef]

代码

class Solution {
    public boolean find132pattern(int[] nums) {
        if (nums == null) {
            return false;
        }
        
        int len = nums.length;
        if (len < 3) {
            return false;
        }
        
        int[] Min = new int[len];
        int[] Rev = new int[len];
        Min[0] = 0;
        Rev[0] = -1;
        
        for (int i = 1, j = i - 1; i < len; ++i) {
            j = i - 1;
            while (j >= 0) {
                if (nums[j] == nums[i]) {
                    Rev[i] = Rev[j];
                    break;
                } else if (nums[j] > nums[i]) {
                    if (nums[i] > nums[Min[j]]) {
                        return true;
                    } else {
                        Rev[i] = j;
                        break;
                    }
                } else {
                    j = Rev[j];
                }
            }
            if (j < 0) {
                Rev[i] = -1;
            }
            Min[i] = nums[i - 1] > nums[Min[i - 1]] ? Min[i - 1] : i - 1; 
        }
        
        return false;
    }
}

你可能感兴趣的:(栈-N456-132模式)