LeetCode: 334. Increasing Triplet Subsequence
题目描述
Given an unsorted array return whether an increasing subsequence of length 3 exists or not in the array.
Formally the function should:
Return true if there exists i, j, k
such that arr[i] < arr[j] < arr[k] given 0 ≤ i < j < k ≤ n-1 else return false.
Note: Your algorithm should run in O(n) time complexity and O(1) space complexity.
Example 1:
Input: [1,2,3,4,5]
Output: true
Example 2:
Input: [5,4,3,2,1]
Output: false
解题思路
- 记,
min
,mid
为最左边的上升子序列 - 遍历
min
为nums[:i+1]
最小数 - 如果
min
不是nums[i+1]
, 而nums[i+1] < mid
, 则mid
为nums[i+1]
- 如果
min
和mid
都不是nums[i+1]
(说明了nums[i+1]
大于mid
,而mid >min
) 构成了三个数的上升子序列
AC 代码
func increasingTriplet(nums []int) bool {
min := int(math.MaxInt32)
mid := int(math.MaxInt32)
for i := 0; i < len(nums); i++ {
if nums[i] <= min { // 遍历 min 为 nums[:i+1] 最小数的情况(取等是因为不允许 mid == min)
min = nums[i]
} else if nums[i] <= mid { // 当 min 为 nums[:i+1] 最小时,mid 为第二小(取等是因为不允许 mid == max)
mid = nums[i]
} else { // num[:i+1] 已经找出 min 和 mid, 而numS[i+1] 大于 mid 和 min, 为第三大的数
return true
}
}
return false
}