题目
给你一个整数数组 nums
,判断这个数组中是否存在长度为 3
的递增子序列。
如果存在这样的三元组下标 (i, j, k)
且满足 i < j < k
,使得 nums[i] < nums[j] < nums[k]
,返回 true
;否则,返回 false
。
示例 1:
输入:nums = [1,2,3,4,5] 输出:true 解释:任何 i < j < k 的三元组都满足题意
示例 2:
输入:nums = [5,4,3,2,1] 输出:false 解释:不存在满足题意的三元组
示例 3:
输入:nums = [2,1,5,0,4,6] 输出:true 解释:三元组 (3, 4, 5) 满足题意,因为 nums[3] == 0 < nums[4] == 4 < nums[5] == 6
提示:
1 <= nums.length <= 5 * 105
-231 <= nums[i] <= 231 - 1
进阶:你能实现时间复杂度为 O(n)
,空间复杂度为 O(1)
的解决方案吗?
解题思路
最开始没看清思路,以为是要连续三个递增数字,实际上三个数字是可以间隔的。
思路一:找到每个数字左边最小数字和右边最大数字,如果该数字大于左边最小,小于右边最大,则符合题意。通过双指针得到两个数组,leftmin和rightmax。可是这种情况下无法达到空间复杂度O(1)。
思路二:三个数字如果分别为first、second、third,则是first<second<third。因此将first初始值设置为数组第一个数,第二第三个数设置为无穷大。遍历数组,如果检测到的数大于第三个数,那么third=该数,如果该数大于第一个数,那么second=该数,小于第一个数那就将该数设置为first。此时符合进阶要求。
代码
class Solution {
public boolean increasingTriplet(int[] nums) {
int len = nums.length;
int first = nums[0];
int second = Integer.MAX_VALUE;
int third = Integer.MAX_VALUE;
for(int i=1;i<len;i++)
{
if(nums[i]>second)
{
third = nums[i];
return true;
}
else if(nums[i]>first)
second = nums[i];
else
first = nums[i];
}
return false;
}
}
扩展
java里最大整数为Integer.MAX_VALUE也就是