334. Increasing Triplet Subsequence

原题链接

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

题目的意思是判断数组中是否存在三个数的递增数列,这三个数不要求是相邻的,比如[1,4,2,7,5]中1、2、5就是符合要求的数列。

我分别用start和mid来记录数列中最小值和中间值的候选值。这两个值都初始为INT_MAX。遍历数组,比较当前数组元素与start的大小,由于第一个元素肯定比INT_MAX小,所以实际上start初始为首元素。接着遍历,如果当前元素比start小,用贪婪算法的思路,把start赋值为当前元素是安全的,因为后面找到的比start大的元素一定也比当前元素大。如果当前元素比start大且比mid小,那么把mid赋值为当前元素是安全的,首先当前元素是比start大的,其次后面找到的比mid大的元素一定也比当前元素大。根据上述的算法,能保证mid一定是比start大的。如果当前元素比mid大,那我们就成功找到一个递增数列了。

遍历中会出现一种情形,就是mid出现在start的前面。例如[2,3,1,……]这个数组,一开始start是2,mid是3。遍历到1时,start就变为了1,这时1是在3后面出现的。但这样也不会影响算法的正确性,因为mid的存在隐含地表明了它前面存在一个比它小的元素。所以如果在后面找到比mid大的元素,无论start的位置在哪,依然表面存在递增数列。如果后面找到比start大比mid小的元素,就可以把mid赋值为那个元素(同样是贪婪算法的思路),这时mid又跑到start的后面去了。

class Solution {
public:
    bool increasingTriplet(vector<int>& nums) {
        if(nums.size()<3) return false;
        int start = INT_MAX, mid = INT_MAX;
        
        for(int i=0; i<nums.size(); i++) {
            if(nums[i]<=start) start=nums[i];
            else if(nums[i]<=mid) mid=nums[i];
            else return true;
        }
        return false;
    }
};

转载于:https://my.oschina.net/cofama/blog/887424

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值