334. 递增的三元子序列
一、题目描述
给你一个整数数组 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
三、分析
依题意,给定 int[] nums,判断是否存在i<j<k,使得nums[i]<nums[j]<nums[k]。
首先暴力解法,三重循环,看是否存在这样的i、j和k满足条件。应该会超时。
第二种解法,贪心 ,维持两个变量a和b使得a一直小于b,遍历数组 nums 来找c,使得c>b。找到c即返回true,否则返回false。
复杂度分析:
暴力解法:;贪心解法只需遍历数组一次,时间复杂度为。
四、编码
class Solution {
public boolean increasingTriplet(int[] nums) {
int len = nums.length;
if ( len < 3){
return false;
}
int a = nums[0], b = Integer.MAX_VALUE;
for(int i = 0; i < len; i++){
int c = nums[i];
if (b < c) {
return true;
} else if (a < c) {
b = c;
} else {
a = c;
}
}
return false;
}
}