Leetcode-334-递增三元子序列
题目链接
题目描述
整数数组 nums ,是否存在长度为 3 的递增子序列。(可以不紧邻)
如果存在这样的三元组下标 (i, j, k) 且满足 i < j < k ,
使得 \(nums[i] < nums[j] < nums[k]\),返回 true ;
否则,返回 false 。
要求
时间复杂度:\(O(n)\)
思路
-
只能想到O(nlogn)的排序做法....我就是菜狗...😭
-
正确做法是贪心:遍历一遍数组,first,second,third记录可能的三元组。first 和 second 要尽可能小, 这样才有更大的机会找到third.
-
先把当前访问的元素看作 third
(1) 如果 third 比 second 大,那就是找到了,直接返回true
(2) 如果 third 比 second 小,但是比first大,那就把 second 的值设为third,然后继续遍历找thrid
(3) 如果 third 比 first 还小,那就把first的值设为third,然后继续遍历找thrid
(这样的话first会跑到second的后边,但是不要紧,因为在second的前边,老first还是满足的)
注: INT_MAX
为int的最大值。
C++代码
class Solution {
public:
bool increasingTriplet(vector<int>& nums) {
int n = nums.size();
int f, s, t;
f = nums[0], s = INT_MAX;
for (int i = 1; i < n; i++) {
if (nums[i] < f)
f = nums[i];
else if (nums[i]<s && nums[i]>f)
s = nums[i];
else if (nums[i] > s)
return true;
}
return false;
}
};