【贪心】递增三元组
递增的三元子序列
给你一个整数数组 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;
}
};