題目
概述:給定一個(gè)整數(shù)數(shù)組,判斷該數(shù)組里是否有滿足132模式的序列(132模式:序列中的第一個(gè)數(shù) < 序列中的第三個(gè)數(shù) < 序列中的第二個(gè)數(shù))
輸入:整數(shù)數(shù)組,長度范圍[0, 15000)
輸出:存在132模式的序列返回true,反之返回false
思路
- 分解為兩個(gè)問題:
- 尋找逆序?qū)?/li>
- 逆序?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
- A[pBef] == A[p] => NEXT
- A[pBef] > A[p] => A[p] > A[Min[pBef]] ? END : NEXT
- 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;
}
}