zoukankan      html  css  js  c++  java
  • 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;
        }
    
  • 相关阅读:
    许家骏
    平均得分 【杭州电-HDOJ-2023】 附加题+详细说明
    百度之星的第二个问题
    kendo ui 单击取消编辑数据grid减少的原因和治疗方法的数据
    2013年第36周准备考下半年的项目管理师
    2013年第36周三杂记
    2013第36周二小结
    2013第36周星期一
    2013年9月1日下午
    2013年8月最后一天晚上
  • 原文地址:https://www.cnblogs.com/xym4869/p/13462824.html
Copyright © 2011-2022 走看看