1. 程式人生 > >Leetcode中級演算法之遞增的三元子序列C++

Leetcode中級演算法之遞增的三元子序列C++

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

數學表示式如下:

如果存在這樣的 i, j, k, 且滿足 0 ≤ i < j < k ≤ n-1,
使得 arr[i] < arr[j] < arr[k] ,返回 true ; 否則返回 false 。
說明: 要求演算法的時間複雜度為 O(n),空間複雜度為 O(1) 。

示例 1:

輸入: [1,2,3,4,5]
輸出: true
示例 2:

輸入: [5,4,3,2,1]

class Solution {
public:
    bool increasingTriplet(vector<int>& nums) {
        int m1 = INT_MAX, m2 = INT_MAX;
        for(auto n : nums)
        {
            if(n <= m1)
                m1 = n;
            else if(n <= m2)
                m2 = n;
            else
                return true;
        }
        return false;
    }
};

思路:使用兩個指標m1和m2,初始化為整型最大值,遍歷陣列,如果m1大於等於當前數字,則將當前數字賦給m1;如果m1小於當前數字且m2大於等於當前數字,那麼將當前數字賦給m2,一旦m2被更新了,說明一定會有一個數小於m2,那麼我們就成功的組成了一個長度為2的遞增子序列,所以我們一旦遍歷到比m2還大的數,我們直接返回ture。如果我們遇到比m1小的數,還是要更新m1,有可能的話也要更新m2為更小的值,畢竟m2的值越小,能組成長度為3的遞增序列的可能性越大