給出一個無序的整數序列,返回是否存在遞增的三元組子序列。 如果存在 i, j, k 使得 arr[i]即返回true;如果不存在則返回false。
解法一
public static void main(String[] args) {
int[] inputNums = { 6, 4, 3, 2, 4, 7, 1 };
System.out.println(isExist(inputNums));
}
public static boolean isExist(int[] inputNums) {
if (inputNums.length < 2) {
return false;
}
int smallestBefore = inputNums[0];
boolean[] existSmallerArray = new boolean[inputNums.length];
for (int i = 1; i < inputNums.length; i++) {
if (inputNums[i] > smallestBefore) {
existSmallerArray[i] = true;
} else {
smallestBefore = inputNums[i];
}
}
int largestAfter = inputNums[inputNums.length - 1];
for (int i = inputNums.length - 2; i >= 0; i--) {
if (inputNums[i] < largestAfter && existSmallerArray[i]) {
return true;
}
if (inputNums[i] >= largestAfter) {
largestAfter = inputNums[i];
}
}
return false;
}
思路
這道題起先我使用的是暴力破解法,時間耗費的是 O(N3)。如果是需要找遞增的二元組的話完全可以使用 O(N)的遍曆方法,但是在解題中,第二個數和第三個數進行對比的前提是第二個數大於第一個數,而這個前提又是基於對數組的遍曆,所以形成了 O(N3)。
可以想到的最佳化是第一個迴圈用來一邊遍曆一邊對比,對比為真時再進入下一個迴圈,這時的空間複雜度為 O(N2)
如果不想嵌套下一個迴圈的,可以使用數組將比較完成的狀態進行儲存。另開一個迴圈,對比遍曆時使用數組中的資料得出結果,這種方法的空間複雜度是O(N)。
解法二
public static boolean isExist2(int[] inputNums){
if(inputNums.length < 3){
return false;
}
int first = Integer.MAX_VALUE;
int second = Integer.MAX_VALUE;
for(int i = 0; i < inputNums.length; i++){
if(inputNums[i] < first){
first = inputNums[i];
continue;
}
if(inputNums[i] > first && inputNums[i] < second){
second = inputNums[i];
continue;
}
if(inputNums[i] > second){
return true;
}
}
return false;
}
思路
保留了此前兩個比較狀態在 first 和 second 兩個變數之中,第三個最大數只和第二個儲存變數進行對比即可。