给定一个未排序的数组,请判断这个数组中是否存在长度为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
.
致谢:
特别感谢 @DjangoUnchained 添加这道题并创建所有测试用例。
这条题一看就是用遍历就TLE不给你过的。。。然而我用了3层遍历之后竟然过了。。
下面是别人4ms的代码,看完之后恍然大悟,只要在遍历的时候不断更新前两个数的值,然后找到第三个数就行了。
第一次更新middle时,确定了一个递增的二元子序列,之后更新middle,会不断减小二元子序列的值,直到我们确定第三个数为止,以此递推下去,可以确定递增的n元子序列。
如果题目出的是什么100元子序列让我做,遍历100层。。。想想都可怕。。。
bool increasingTriplet(int* nums, int numsSize) { int min = 2147483647; int middle = 2147483647; for(int i=0; i<numsSize; i++){ if(nums[i]<=min){ min=nums[i]; } if(nums[i]>middle){ return true; } if(nums[i]<middle&&nums[i]>min){ middle=nums[i]; } } return false; }
原文地址:https://www.cnblogs.com/onlyandonly/p/9315205.html
时间: 2024-10-12 03:54:32