leetcode之334递增的三元子序列Golang
题目描述
给定一个未排序的数组,判断这个数组中是否存在长度为 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
}
浙公网安备 33010602011771号