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;
}