自取题目:https://leetcode.cn/problems/increasing-triplet-subsequence/
原题目
给你一个整数数组 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 的三元组都满足题意
大致思路
- 该题意最后描述出递增子序列,这意味着三个数字在原数组中可以不连续
- 三元组下标 (i, j, k) 且满足 i < j < k ,使得 nums[i] < nums[j] < nums[k],下标依次增长,就是按照顺序遍历数组。
- 题目示意我们要找出三个递增数组,可以将此问题化为两个部分:
-
1.找到两个递增的数字 2.找到一个比这两个都大的数字,找得到就返回ture,反之则返回false
变量定义
- first 定义最小的数字,second 定义子列中第二大的数字,为了减少代码量,可以先定义first为数组第一个数字,second定义成int中最大的数字,在接下来将会替换成目标数字
- 当发现当前数字大于second的时候返回ture
代码实现
public static boolean increasingTriplet(int[] nums) {
if (nums.length <3) //减少运行时间
return false;
int first = nums[0],second = Integer.MAX_VALUE;
for (int i = 1; i < nums.length; i++) {
int num = nums[i];
if (num > second)
return true;
else if (num <= first)
first = num; //保持first为最小的数字
else second = num; //遇到比first大的就定义成second
}
return false;
}
测试图
闲话时间
最开始按照基本逻辑写了个简单的代码,顺畅到吃惊,结果测试的时候发现一个测试用例好像是50万1和2,一下子就超时了【吃惊】。