1. 程式人生 > 其它 >Leetcode 334. Increasing Triplet Subsequence(遞增三元的子序列)

Leetcode 334. Increasing Triplet Subsequence(遞增三元的子序列)

Leetcode 334. Increasing Triplet Subsequence

題目

https://leetcode-cn.com/problems/increasing-triplet-subsequence/

描述

題目很簡單,如果存在遞增的三元子序列的話,返回true。否則返回false。

要注意子序列不要求是連續的。子串是連續的。

Solution

dp解法

可以借鑑最長遞增子序列的DP解法,但dp解法時間複雜度是O(n^2),最後會超時。

int dp[] = new int[arr.length];
Arrays.fill(dp, 1);
for (int i = 1; i < arr.length; i++) {
for (int j = 0; j < i; j++) {
if (arr[i] > arr[j])
dp[i] = Math.max(dp[i], dp[j] + 1);
}
}
int max = dp[0];
for(int i = 1;i< arr.length;i++)
max = Math.max(max, dp[i]);
return max;

貪心

可以在一次遍歷中維護一個first最小值和second次小值。如果出現比second大的第三個元素即表示出現了遞增的三元組。

arr[i] >first, 更新second;

要注意更新之後再 比較 arr[i] > second,有可能會使得第三大的元素被儲存在了second中,所以要先比較arr[i]是否大於second。

或者說可以按照小於的順序比較。

boolean solution(int arr[]) {
int first = arr[0];
int second = Integer.MAX_VALUE;
for (Integer E : arr) {
if (E < first)
first = E;
else if (E < second)
second = E;
else
return true;
}
return false;
}
boolean solution(int arr[]) {
int first = arr[0];
int second = Integer.MAX_VALUE;
for (Integer E : arr) {
if (E > second)
return true;
else if (E > first)
second = E;
else
first = E;
}
return false;
}