leetcode之334遞增的三元子序列Golang
阿新 • • 發佈:2020-11-02
題目描述
給定一個未排序的陣列,判斷這個陣列中是否存在長度為 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
演算法
核心思想就是遍歷一遍陣列,然後記錄遍歷到的遞增的序列,當序列的長度等於3的時候就返回true
false
- 定義一個數組用來儲存遞增的子序列,定義一個變數
min
來儲存當前遍歷到的最小的值,將陣列的第一個元素存入結果陣列中。 - 從第二個元素開始遍歷陣列
- 當遍歷的數小於或者等於結果陣列的第1個元素時:
- 如果這個時候結果陣列中只有1個元素,那麼就將這個元素替換設定為結果陣列中第1個元素。
- 如果此時結果陣列中有兩個元素(結果陣列中的元素是遞增的)
- 如果當前元素比
min
中的元素大,那麼就將min
的元素設定 為結果陣列的第1個元素,將當前遍歷到的元素設定為結果陣列的第二個元素 - 如果當前元素比
min
中的元素小,那麼就用當前元素的值替換min
中的值
- 如果當前元素比
- 當遍歷到的數大於結果陣列中的第1個元素時:
- 如果結果陣列中只有1一個元素,那麼就將這個數存入結果陣列的第二個元素
- 如果結果陣列中有兩個元素:
- 如果當前遍歷到的數比結果陣列中第2個元素大,那麼就相當於找到了遞增子序列的第3個元素,直接返回
true
- 如果當前遍歷到的數小於或者等於結果陣列中的第2個元素,那麼就用當前遍歷到的數替換結果陣列中的第2個元素
- 如果當前遍歷到的數比結果陣列中第2個元素大,那麼就相當於找到了遞增子序列的第3個元素,直接返回
- 當遍歷的數小於或者等於結果陣列的第1個元素時:
程式碼
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 }