1. 程式人生 > >leetcode--中級演算法--陣列和字串--遞增的三元子序列(JavaScript)

leetcode--中級演算法--陣列和字串--遞增的三元子序列(JavaScript)

給定一個未排序的陣列,判斷這個陣列中是否存在長度為 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;
};