Skip to content

【贪心】递增三元组

递增的三元子序列

给你一个整数数组 nums ,判断这个数组中是否存在长度为 3 的递增子序列。

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

最长递增子序列的子问题

只需找到LIS,在判断是否长于3即可。

动规\(O(n^2)\),贪心\(O(n\log n)\)

class Solution {
public:
    bool increasingTriplet(vector<int>& nums) {
        int n = nums.size();
        vector<int> v;
        for (int i = 0; i < n; i++) {
            int idx = lower_bound(v.begin(), v.end(), nums[i]) - v.begin();
            if (idx == v.size()) v.push_back(nums[i]); 
            else v[idx] = nums[i];
        }
        return v.size() >= 3;
    }
};

更简单的想法

和上面的贪心做法思路一致,只不过只记录第一小和第二小的值,这样一旦出现更大的值,就说明有三元组了。

class Solution {
public:
    bool increasingTriplet(vector<int>& nums) {
        int len = nums.size();
        if (len < 3) return false;
        int small = INT_MAX, mid = INT_MAX;
        for (auto num : nums) {
            if (num <= small) small = num;
            else if (num <= mid) mid = num;
            else if (num > mid) return true;
        }
        return false;    
    }
};