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

 

posted @ 2022-01-13 20:16  Dre_am_tale  阅读(35)  评论(0编辑  收藏  举报