LeetCode-递增的三元子序列

算法记录

LeetCode 题目:

  给你一个整数数组 nums ,判断这个数组中是否存在长度为 3 的递增子序列。

  如果存在这样的三元组下标 (i, j, k) 且满足 i < j < k ,使得 nums[i] < nums[j] < nums[k] ,返回 true ;否则,返回 false 。


说明

一、题目

输入: preorder = "9,3,4,#,#,1,#,#,2,#,6,#,#"
输出: true
复制代码

二、分析

  • 三个元素要呈现递增的顺序进行展示,也就是说前一个数小于中间数,后一个数大于中间数,那么我们可以先找出当前位置之前的最小值和之后的最大值,判断当前数是否刚好在这个区间之内即可完成。
  • 但是这样会有一个缺点就是必须得遍历 2 * n 以上才行。
  • 使用贪心来进行计算,我们只需要维护当前位置前的两个最小的递增元素,如果当前的元素大于第二个,即找到了一个递增的三元序列;如果说当前元素比第二个元素还要小,之后出现比当前第二个大的元素肯定也大于当前的元素,条件成立更换第二个元素值为当前元素值;如果说当前元素小于第一个最小元素,那么就将第一个元素替换掉即可。
  • 可能对于第三个条件判断有点儿疑问,这里再做一下解释。case 第三个条件之后遇见第一种情况不会影响到之前的一对序列的结果,遇见第二种情况的话刚好可以更新比前一对结果更优的答案,遇见第三种情况更是没有影响,因此可以选着替换。
class Solution {
    public boolean increasingTriplet(int[] nums) {
        if(nums.length < 3) return false;
        int first = nums[0], second = Integer.MAX_VALUE;
        for(int i = 1; i < nums.length; i++) {
            if(nums[i] > second) return true;
            if(nums[i] > first) second = nums[i];
            if(nums[i] < first) first = nums[i];
        }
        return false;
    }
}
复制代码

总结

贪心策略。

猜你喜欢

转载自juejin.im/post/7107589874839978015