LeetCode——递增的三元子序列

Q:给定一个未排序的数组,判断这个数组中是否存在长度为 3 的递增子序列。
数学表达式如下:

如果存在这样的 i, j, k,  且满足 0 ≤ i < j < k ≤ n-1,
使得 arr[i] < arr[j] < arr[k] ,返回 true ; 否则返回 false 。

说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1) 。

示例 1:
输入: [1,2,3,4,5]
输出: true
示例 2:
输入: [5,4,3,2,1]
输出: false

A:

  1. 动态规划:dp装递增个数,遍历所有比当前值小的,取最大的递增个数+1
    public boolean increasingTriplet(int[] nums) {
        int[][] sortNum = new int[nums.length][2];
        for (int i = 0; i < nums.length; i++) {
            sortNum[i][0] = nums[i];
            sortNum[i][1] = i;
        }
        Arrays.sort(sortNum, Comparator.comparingInt(t -> t[0]));
        int[] dp = new int[nums.length];
        Arrays.fill(dp, 0);
        for (int i = 1; i < nums.length; i++) {
            for (int j = i - 1; j >= 0; j--) {
                if (sortNum[i][0] > sortNum[j][0] && sortNum[i][1] > sortNum[j][1]) {
                    dp[i] = Math.max(dp[j] + 1, dp[i]);
                }
            }
            if (dp[i] >= 2)//这里是放所有比当前值小的数值个数,所以为2
                return true;
        }
        return false;
    }
  1. 双指针:两个指针分别放最小和次小。
    public boolean increasingTriplet(int[] nums) {
        if (nums.length <= 2)
            return false;
        int B = Integer.MAX_VALUE, A = Integer.MAX_VALUE;
        for (int n : nums) {
            if (n < A) //比最小的还小,最小的重置
                A = n;
            else if (n > B) //比次小的大,找到递增三元
                return true;
            else if (n < B && n > A)//比最小的大但比次小的小,重置次小
                B = n;
        }
        return false;
    }
原文地址:https://www.cnblogs.com/xym4869/p/13462824.html