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 @   ARUI丶  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示
主题色彩