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
}

posted @ 2020-11-02 20:23  胖胖咩  阅读(93)  评论(0)    收藏  举报