Loading

Leetcode-334-递增三元子序列

题目链接


题目描述

整数数组 nums ,是否存在长度为 3 的递增子序列。(可以不紧邻)

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

要求

时间复杂度:\(O(n)\)

思路

  1. 只能想到O(nlogn)的排序做法....我就是菜狗...😭

  2. 正确做法是贪心:遍历一遍数组,first,second,third记录可能的三元组。first 和 second 要尽可能小, 这样才有更大的机会找到third.

  3. 先把当前访问的元素看作 third
    (1) 如果 third 比 second 大,那就是找到了,直接返回true
    (2) 如果 third 比 second 小,但是比first大,那就把 second 的值设为third,然后继续遍历找thrid
    (3) 如果 third 比 first 还小,那就把first的值设为third,然后继续遍历找thrid
    (这样的话first会跑到second的后边,但是不要紧,因为在second的前边,老first还是满足的

注: INT_MAX 为int的最大值。

C++代码

class Solution {
public:
    bool increasingTriplet(vector<int>& nums) {
        int n = nums.size();
        int f, s, t;
        f = nums[0], s = INT_MAX;
        for (int i = 1; i < n; i++) {
            if (nums[i] < f)
                f = nums[i];
            else if (nums[i]<s && nums[i]>f)
                s = nums[i];
            else if (nums[i] > s)
                return true;
        }
        return false;
    }
};
posted @ 2022-01-12 20:35  ARUI丶  阅读(26)  评论(0编辑  收藏  举报