Leetcode中級演算法之遞增的三元子序列C++
阿新 • • 發佈:2018-12-01
給定一個未排序的陣列,判斷這個陣列中是否存在長度為 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的遞增序列的可能性越大