棧-N456-132模式

題目

  • 概述:給定一個(gè)整數(shù)數(shù)組,判斷該數(shù)組里是否有滿足132模式的序列(132模式:序列中的第一個(gè)數(shù) < 序列中的第三個(gè)數(shù) < 序列中的第二個(gè)數(shù))

  • 輸入:整數(shù)數(shù)組,長度范圍[0, 15000)

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

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

思路

  • 分解為兩個(gè)問題:
    1. 尋找逆序?qū)?/li>
    2. 逆序?qū)Φ暮笠粋€(gè)元素大于從第一個(gè)元素到逆序?qū)η耙粋€(gè)元素的最小值
  • 遍歷整個(gè)數(shù)組,記錄第一個(gè)元素到每個(gè)元素(不包括)之間的最小值下標(biāo)Min,同時(shí)記錄每個(gè)元素和之前能和其構(gòu)成逆序?qū)Φ脑兀ㄗ罱囊粋€(gè))下標(biāo)Rev
  • 記數(shù)組為A,當(dāng)前遍歷元素下標(biāo)為p,上一個(gè)遍歷元素下標(biāo)為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;
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容