LeetCode 334. Increasing Triplet Subsequence

LeetCode 334. Increasing Triplet Subsequence(递增的三元子序列)

题目

链接

https://leetcode-cn.com/problems/increasing-triplet-subsequence/

问题描述

给定一个未排序的数组,判断这个数组中是否存在长度为 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

提示

1 <= nums.length <= 5 * 105
-231 <= nums[i] <= 231 - 1

思路

我们需要求的是一个数组是否存在递增子序列,不需要考虑等于的情况。

首先取第一个数为 first,设置 second 为最大值,之后对于数组进行遍历,有如下几种情况。

  1. 这个数大于 second,就达成了递增情况,直接返回 true。
  2. 这个数小于 first,就更新 first 的值。(新 first < 老 first < second,不过不影响下一步的寻找第三个数,因为第三个数大于 second 的同时,老 first 依旧在 second 的前面 )
  3. 这个数大于 first,小于 second,更新 second 的值。

遍历结束,直接输出 false。

复杂度分析

时间复杂度 O(n)
空间复杂度 O(1)

代码

Java

    public boolean increasingTriplet(int[] nums) {
        if (nums.length < 3) {
            return false;
        }
        int first = nums[0];
        int second = Integer.MAX_VALUE;
        for (int i = 1; i < nums.length; i++) {
            if (nums[i] > second) {
                return true;
            }
            if (nums[i] < first) {
                first = nums[i];
            }
            if (nums[i] > first && nums[i] < second) {
                second = nums[i];
            }
        }
    
        return false;
    }
posted @ 2019-07-28 10:32  cheng102e  阅读(157)  评论(0编辑  收藏  举报