leetcode 334 Increasing Triplet Subsequence

题意:给一个序列nums,问是否存在一个至少长度为3的上升子序列,要求时间复杂度O(n),空间复杂度O(1)。

解法:刷的第一道leetcode……medium……读题读错好多遍……真是……

时间复杂度要求的很紧……一时间没想到好方法……于是看了题解orz

大概思想就是用两个变量n1和n2,n1表示当前找到的上升子序列里最小的,n2表示找到的第2小的,当遍历到的这个数x比n1小就更新n1,否则如果比n2小就更新n2,否则就认为答案存在。

一开始没太想明白……后来明白了……n2可以认为是当前存在的长度为2的上升子序列里结尾数字最小的序列的结尾数字,如果存在比它大的答案就成立,n1认为是当前所有数中最小的,如果出现介于n1和n2之间的数时更新了n2,所以我认为n1是作为更新n2的条件存在的,只有在更新n2之前有更小的数字才可以更新,否则就保留为原来的子序列……嗯……

代码:

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

  

原文地址:https://www.cnblogs.com/Apro/p/5194976.html