题目描述
给你一个整数数组 nums ,判断数组中是否存在长度为 3 的递增子序列:
cpp
i < j < k
nums[i] < nums[j] < nums[k]
如果存在,返回 true,否则返回 false。
解题思路(核心精髓)
不用 DP、不用开数组、不用找子序列!
我们只维护两个最小值:
one:遍历到目前为止最小的数tow:遍历到目前为止比 one 大的最小数
遍历规则:
- 如果当前数 <= one → 更新最小 one
- 否则如果当前数 在 one 和 two 之间 → 更新 two
- 否则 比 two 还大 → 直接说明:找到了
one < two < cur,存在三元递增序列,返回 true
为什么能这么做?
one永远保证是全局最小two永远保证是次小、且在 one 之后- 一旦出现比 two 大的数,天然构成三元组
不需要记录下标!只要大小关系成立,一定满足 i<j
cpp
class Solution {
public:
bool increasingTriplet(vector<int>& nums) {
long long one;
long long tow=1e18;
one=nums[0];
int n=nums.size();
for(int i=1;i<n;i++)
{
if(nums[i]<=one)
one=nums[i];
else if(nums[i]>one&&nums[i]<=tow)
tow=nums[i];
else
return true;
}
return false;
}
};