1. 程式人生 > 實用技巧 >leetcode之334遞增的三元子序列Golang

leetcode之334遞增的三元子序列Golang

題目描述

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

數學表示式如下:

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

演算法

核心思想就是遍歷一遍陣列,然後記錄遍歷到的遞增的序列,當序列的長度等於3的時候就返回true

,如果整個陣列都遍歷完了,那麼就返回false

  • 定義一個數組用來儲存遞增的子序列,定義一個變數min來儲存當前遍歷到的最小的值,將陣列的第一個元素存入結果陣列中。
  • 從第二個元素開始遍歷陣列
    • 當遍歷的數小於或者等於結果陣列的第1個元素時:
      • 如果這個時候結果陣列中只有1個元素,那麼就將這個元素替換設定為結果陣列中第1個元素。
      • 如果此時結果陣列中有兩個元素(結果陣列中的元素是遞增的)
        • 如果當前元素比min中的元素大,那麼就將min的元素設定 為結果陣列的第1個元素,將當前遍歷到的元素設定為結果陣列的第二個元素
        • 如果當前元素比min中的元素小,那麼就用當前元素的值替換min中的值
    • 當遍歷到的數大於結果陣列中的第1個元素時:
      • 如果結果陣列中只有1一個元素,那麼就將這個數存入結果陣列的第二個元素
      • 如果結果陣列中有兩個元素:
        • 如果當前遍歷到的數比結果陣列中第2個元素大,那麼就相當於找到了遞增子序列的第3個元素,直接返回true
        • 如果當前遍歷到的數小於或者等於結果陣列中的第2個元素,那麼就用當前遍歷到的數替換結果陣列中的第2個元素

程式碼

func increasingTriplet(nums []int) bool {
	if len(nums) < 3 {
		return false
	}
	res := []int{nums[0]}
	min := int(^uint(0) >> 1)
	for index := 1; index < len(nums); index++ {
		if res[0] >= nums[index] {
			if len(res) == 1 {
				res[0] = nums[index]
			} else {
				if min < nums[index] {
					res[0] = min
					res[1] = nums[index]
				} else {
					min = nums[index]
				}
			}
		} else {
			if len(res) == 1 {
				res = append(res, nums[index])
			} else {
				if nums[index] > res[1] {
					return true
				}
				res[1] = nums[index]
			}
		}
	}
	return false
}