1. 程式人生 > >遞增的三元子序列

遞增的三元子序列

試用 middle 是否 示例 給定 我們 存在 col 所有

給定一個未排序的數組,請判斷這個數組中是否存在長度為3的遞增的子序列。

正式的數學表達如下:

如果存在這樣的 i, j, k, 且滿足 0 ≤ i < j < kn-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; }

遞增的三元子序列