递增的三元子序列
题目:给你一个整数数组 nums ,判断这个数组中是否存在长度为 3 的递增子序列。如果存在这样的三元组下标 (i, j, k) 且满足 i < j < k ,使得 nums[i] < nums[j] < nums[k] ,返回 true ;否则,返回 false 。
输入:nums = [1,2,3,4,5]
输出:true
方法一:维护前两个数。one和two分别代表第一小和第二小的数,
class Solution {
public boolean increasingTriplet(int[] nums) {
int one = Integer.MAX_VALUE;
int two = Integer.MAX_VALUE;
for(int i = 0; i < nums.length; i++){
if(nums[i] > two){//大于第二个数,说明找到了长度为三的递增子序列
return true;
}else if(nums[i] > one){//大于第一个数,one不变,two变小
two = nums[i];
}else if(nums[i] < one){
//一方面,用于维护新的one和two;
//另一方面,遇到大于two的数时,在未修改新的two之前,序列的前两个数是相对于之前的one和two。
one = nums[i];
}
}
return false;
}
}
方法二:三次遍历,遍历三遍,从左向右找最小,从右向左找最大,最后一遍找中间
class Solution {
public boolean increasingTriplet(int[] nums) {
int[] left = new int[nums.length];
left[0] = nums[0];
int[] right = new int[nums.length];
right[nums.length - 1] = nums[nums.length - 1];
for(int i = 1; i < nums.length; i++){
left[i] = Math.min(left[i - 1], nums[i]);
}
for(int i = nums.length - 2; i >= 0; i--){
right[i] = Math.max(right[i + 1], nums[i]);
}
for(int i = 0; i < nums.length; i++){
if(nums[i] > left[i] && nums[i] < right[i]) return true;
}
return false;
}
}