LeetCode-334. 递增的三元子序列-详解-Java实现

题目链接

题目

LeetCode-334. 递增的三元子序列-详解-Java实现_第1张图片

结果

LeetCode-334. 递增的三元子序列-详解-Java实现_第2张图片
代码如下:

class Solution {
    public boolean increasingTriplet(int[] nums) {
        if(nums==null||nums.length<3){
            return false;
        }
        int small = Integer.MAX_VALUE;
        int big = Integer.MAX_VALUE;
        
        for(int i = 0;i < nums.length;i++){
            int target = nums[i];
            if(target < small){
                small = target;
            }else if(target > small && target < big){
                big = target;
            }else if(target > big){
                return true;
            }
        }
        return false;
        
    }
}

思路

这道题想到了一种方法,但是不能满足空间复杂度和时间复杂度,所以找到了网上的做法,下面解释一下这个思路:
其实就是通过两个指针,一个指向小的数据(small),一个指向中间的数据(big,比small大的数),如果发现了比big还大的话,那么就达到了题目要求的3个长度子序列,可是为什么要把后面的小的数据更新到small和big呢?
其实我们为了要达到题目要求,只需要比较big就好了,如果发现比big大的数,那么就符合了,所以如果我们的big越小,那么这个数越好找,相反,如果越大,那么可能回漏掉一些机会。
既然我们要想让big小,那么根据我们的思路,big是比small大的数,如果small小的话,那么big是不是就更容易找,道理同big?
假设我们现在没有small,那么第一个数,就是small,如果第二个数比small小呢,那第二个数就是small,为什么不是big呢?因为要求的是序列呀,序列要的是顺序的。假设我们找到了一个比small大的数,那么就放到big里面,这时可以想一下,如果这个big比之前的small(指的是被替换的small)小的话,是不是后面找到的概率更大了(比没有替换small之前),因为没有替换small,那么big势必变得更大,那么比big大的数更难找了,甚至可能漏掉唯一的答案(3,1,2,3,这个例子可以考虑一下)。
big找到了,现在可能存在三种情况:

  1. 如果找到比big大的数,那么没问题,这就是答案。
  2. 如果找到比small小的数,那么small就是它,为什么呢?首先我们考虑替换了这个small后万一后面的一个数就是替换前的比big大的数(也就是正确答案),影不影响我们判断正确答案?很显然,不影响,因为此时big卡住了界限,不论small变得多小,big代表的是替换前的序列,正确答案只和big有关系。其次,替换small后,我们有机会找到更小的big,比如替换后small是1,big是5,那么假如后面的数是2、3,那么big就是2,3又比2大,这样不就是最终答案了吗,如果不替换small的话,big也替换不了,1,2,3也就不会被认为是正确序列了,这就是我们说的不漏掉答案。
  3. 如果找到比small大,比big小的数,那么它就是big,为什么要替换呢?我们说过只有big小了才容易找到正确答案,假如我们没有替换的话,那么可能有比旧big小的数,却比新big大的数被我们漏掉了,比如:现在small是1,big是5,后面的数是2,3,如果不替换,那么是找不到答案的,如果我们替换成2的话,那么到3的时候就意味着我们找到了正确答案。比旧的big大的数,一定比新的big大,所以新的big可能性更大,即使在替换后,后面的数比新旧big都大,那也不影响我们找到答案,因为我们只需要证明有正确答案就好了。

总结一下

看了解析,我们可以总结一下,分为如下情况:

  1. 如果只有small,没有big,那么意味着这个数组是非升序排列的,也就是找不到任意的两个数是递增的。这样当然没有答案。
  2. 如果有small和big,small和big可能是一对(一对就表明是先替换的small,后替换的big),那这样如果后面有比big大的数,那么就代表正确答案,这个很符合逻辑。
  3. 如果有small和big,那么big可能代表的是旧的small的big,这样的话,并不影响我们判断,因为我们比较的是big,只要比big大的话,那么就有正确答案,如果比small大,比big小,那么就会转移到2状态。

你可能感兴趣的:(LeetCode,数据结构与算法)