给定一个未排序的数组,请判断这个数组中是否存在长度为3
的递增的子序列。
正式的数学表达如下:
如果存在这样的i, j, k
, 且满足 0 ≤ i < j < k ≤ n-1
,
使得arr[i] < arr[j] < arr[k]
,返回 true ; 否则返回 false 。
要求算法时间复杂度为O(n)
,空间复杂度为O(1)
。
示例:
输入 [1, 2, 3, 4, 5]
,
输出true
.
输入 [5, 4, 3, 2, 1]
,
输出 false
.
根据题意可知,若目标数组nums
存在递增的三元子序列,设这三个数为a1
,a2
,a3
,则a3>a2>a1
,可以先定义两个变量small
,big
(samll)分别用于存放最小的两个数字,在js中使用Number.MAX_SAFE_INTEGER 常量表示最大的安全整数(maxinum safe integer)(2^53 - 1)。,然后遍历数组,实时捕获当前最小的两个数,同时判断在这两个数后方是否存在一个数字
a3>small && a3>big
,若存在,即该数组存在长度为3
的递增的子序列。
/**
* @param {number[]} nums
* @return {boolean}
*/
var increasingTriplet = function(nums) {
var small = Number.MAX_SAFE_INTEGER;
var big = Number.MAX_SAFE_INTEGER;
for (var i = 0; iif (nums[i] <= small) {
small = nums[i];
} else if (nums[i] <= big) {
big = nums[i];
} else {
return true;
}
}
return false;
};