题目描述:
一个整数数组 nums ,判断这个数组中是否存在长度为 3 的递增子序列。
如果存在这样的三元组下标 (i, j, k) 且满足 i < j < k ,使得 nums[i] < nums[j] < nums[k] ,返回 true ;否则,返回 false。难度:中等
链接:力扣
输入:nums = [1,2,3,4,5]
输出:true
解释:任何 i < j < k 的三元组都满足题意
输入:nums = [2,1,5,0,4,6]
输出:true
解释:三元组 (3, 4, 5) 满足题意,因为 nums[3] == 0 < nums[4] == 4 < nums[5] == 6
思路:记最终答案的三个数分别为min、mid、max,通过遍历数组的值来持续记录并更新min和mid的值即可
Java版本:
class Solution {
public boolean increasingTriplet(int[] nums) {
if(nums.length < 3) {
return false; //数组没有三个数肯定不符合条件
}
int mid = Integer.MAX_VALUE, mid = Integer.Max_VALUE; //min和mid初始值分别取最大
for(int num : nums) {
if(num > mid) {
return true; //这里就找到了三个数中max值了
}
if(num <= min) {
min = num; //更新min的值
}else {
mid = num; //更新mid的值,这里已经保证了min是小于mid的
}
}
return false; //遍历完整个数组不满足就返回false即可
}
}
c++版本:
class Solution {
public:
bool increasingTriplet(vector<int>& nums) {
if (nums.size() < 3) {
return false;
}
int min = INT_MAX, mid = INT_MAX;
for (auto num : nums) {
if (num > mid) {
return true;
}
if (num <= min) {
min = num;
} else {
mid = num;
}
}
return false;
}
};
思考:当找到了两个数min和mid,接下来遍历为什么还要把num<min的数替换呢?
A:假设min和mid为 4,6,此时遍历到了1这个数,如果不替换,下个数是2,这时1,2,6这个递增序列就没办法找到了,也就是为了更好的去更新中间的值罢了