[Leetcode] 334. Increasing Triplet Subsequence 解题报告

本文介绍了一种在未排序数组中寻找长度为3的递增子序列的方法,该算法采用一次遍历的方式,并确保了O(n)的时间复杂度和O(1)的空间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

Given an unsorted array return whether an increasing subsequence of length 3 exists or not in the array.

Formally the function should:

Return true if there exists i, j, k 
such that arr[i] < arr[j] < arr[k] given 0 ≤ i < j < k ≤ n-1 else return false.

Your algorithm should run in O(n) time complexity and O(1) space complexity.

Examples:
Given [1, 2, 3, 4, 5],
return true.

Given [5, 4, 3, 2, 1],
return false.

思路

只要我们找到一个递增三元组,就可以返回true。因此我们在遍历的过程中,可以将搜索的过程分为两个阶段:

1)还没有找到递增二元组:如果当前元素小于small,则更新small为当前元素;如果当前元素大于small,则此时已经找到了递增二元组,给middle赋值。

2)已经找到了递增二元组:如果当前元素小于small,则更新small;否则如果介于small和和middle之间,则更新middle;否则说明已经找到了递增三元组,返回true。

如果遍历完所有元素后仍然没有找到递增三元组,则说明不存在递增三元组,返回false。算法的时间复杂度是O(n),空间复杂度是O(1)。

代码

class Solution {
public:
    bool increasingTriplet(vector<int>& nums) {
        if(nums.size() < 3) {
            return false;
        }            
        int small = nums[0], middle = INT_MAX;
        bool has_middle = false;
        for(int i = 1; i < nums.size(); ++i) {
            if(!has_middle) {                                    // try to find the middle element
                if(nums[i] > small) {
                    middle = nums[i];
                    has_middle = true;
                }
                else {
                    small = nums[i];
                }
            }
            else {                                              // try to find the largest element
                if(nums[i] < small) {
                    small = nums[i];
                }
                else if(nums[i] < middle && nums[i] > small) {  // make sure small is not equal to middle
                    middle = nums[i];
                }
                else if(nums[i] > middle) {
                    return true;
                }
            }
        }
        return false;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值