题目要求:
Given an unsorted array return whether an increasing subsequence of length 3 exists or not in the array.
Formally the function should:
Return true if there exists i, j, k
such that arr[i] < arr[j] < arr[k] given 0 ≤ i < j < k ≤ n-1 else return false.
Your algorithm should run in O(n) time complexity and O(1) space complexity.
Examples:
Given [1, 2, 3, 4, 5],
return true.
Given [5, 4, 3, 2, 1],
return false.
题目大意:
判断给定数组中是否含有递增序列,并且判断该序列的元素数是否大于2
解题思路:
一般遇到这种求增长序列问题,博主经常喜欢使用动态规划求解,但这道题由于时间复杂度闲置为 O(n) ,故此我们必须选择另一种解法。
我们维护两个变量 first 和 second, 这只是用来表示前面是否存在2个增长序列,与 first 和 second 对应于 原数组中的顺序没有关系
代码如下:
public static boolean increasingTriplet(int[] nums) {
int first = Integer.MAX_VALUE,second = Integer.MAX_VALUE;
for (int num : nums) {
if(num < first) first = num;
else if (num < second) second = num;
else return true;
}
return false;
}
/**
* nums [ 3,6,1,4,8 ]
*
* 循环过程:
* first second
* 3 MAX_VALUE
* 3 6
* 1 6
* ......
* //虽然在原数组中 1 在 6 的后面 ,
* 但它依旧是个增长序列,只要 second 不等于 MAX_VALUE
* 则必然存在一个增长序列
* 所以 first 和 second 只是一个增长序列,和元素位置无关
*/
网友评论