递增的三元子序列
- 题目描述
- 贪心
题目描述
难度 - 中等
leetcode334. 递增的三元子序列
给你一个整数数组 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 * 10^5
-231 <= nums[i] <= 2^31 - 1
贪心
如果数组 nums中存在一个下标 iii 满足 1≤i<n−1,使得在 nums[i] 的左边存在一个元素小于 nums[i]且在 nums[i] 的右边存在一个元素大于 nums[i],则数组 nums 中存在递增的三元子序列。
在 nums[i] 的左边存在一个元素小于 nums[i] 等价于在 nums[i] 的左边的最小元素小于 nums[i],在 nums[i] 的右边存在一个元素大于 nums[i] 等价于在 nums[i] 的右边的最大元素大于 nums[i],因此可以维护数组 nums 中的每个元素左边的最小值和右边的最大值。
创建两个长度为 n 的数组 leftMin和 rightMax,对于 0≤i<n,leftMin[i]表示 nums[0]到 nums[i]中的最小值,rightMax[i] 表示 nums[i] 到 nums[n−1]中的最大值。
数组 leftMin 的计算方式如下:
1.leftMin[0]=nums[0];
2. 从左到右遍历数组 nums\textit{nums}nums,对于1≤i<n,leftMin[i]=min(leftMin[i−1],nums[i])。
数组 rightMax的计算方式如下:
3.rightMax[n−1]=nums[n−1];
4.从右到左遍历数组 nums\textit{nums}nums,对于 0≤i<n−10 \le i < n - 10≤i<n−1,rightMax[i]=max(rightMax[i+1],nums[i])。
代码演示:
public boolean increasingTriplet(int[] nums) {
if(nums.length < 3){
return false;
}
int first = nums[0];
int second = Integer.MAX_VALUE;
for(int i = 0; i < nums.length;i++){
int num = nums[i];
if(num > second){
return true;
}else if(num > first){
second = num;
}else{
first = num;
}
}
return false;
}