leetcode--中級演算法--陣列和字串--遞增的三元子序列(JavaScript)
阿新 • • 發佈:2018-11-23
給定一個未排序的陣列,判斷這個陣列中是否存在長度為 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]
輸出: false
思路
遞增的三元子序列,時間複雜度為O(n)說明只能一遍迴圈,空間複雜度要求只能有常數個變數。
因此設定兩個變數,one代表三元子序列的第一個,two代表三元子序列的第二個。
例如:
- 第一個數作為one,第二個數若比第一個數大,這兩個數可以成三元子序列中的前兩個,於是可以賦值給two;
- 第三個數比第二個數小,說明三元子序列可能會從這個數開始
one、two的初始值為undefined,任意數與undefined做比較均為false。
現在,開始迴圈遍歷num,若:
- num > two,說明可以構成三元子序列了,返回true
- num > one,說明num比two小(或等於),比one大,可以將two更新為此num,
- num < one,則這個num可以成為三元子序列的最小者,更新one 為 num。
/** * @param {number[]} nums * @return {boolean} */ var increasingTriplet = function(nums) { if (nums.length < 3) return false; let one = undefined, two = undefined; for (let num of nums) { if (num > two) { return true; } else if (num > one) { two = num; } else { one = num; } } return false; };