题目描述
给你一个整数数组 nums
,判断这个数组中是否存在长度为 3
的递增子序列。
如果存在这样的三元组下标 (i, j, k)
且满足 i < j < k
,使得 nums[i] < nums[j] < nums[k]
,返回 true
;否则,返回 false
。
示例 1:
|
|
示例 2:
|
|
示例 3:
|
|
提示:
1 <= nums.length <= 5 * 10^5
-2^31 <= nums[i] <= 2^31 - 1
题解
使用了贪心算法。
从左到右遍历数组 nums,遍历过程中维护两个变量 first 和 second,分别表示递增的三元子序列中的第一个数和第二个数,任何时候都有 first<second。
初始时,first=nums[0],second=+∞。对于 1≤i<n,当遍历到下标 i 时,令 num=nums[i],进行如下操作:
- 如果 num>second,则找到了一个递增的三元子序列,返回 true
- 如果 num>first,则将 second的值更新为 num
- 否则,将 first 的值更新为 num
如果遍历结束时没有找到递增的三元子序列,返回 false。
上述做法的贪心思想是:为了找到递增的三元子序列,first 和 second 应该尽可能地小,此时找到递增的三元子序列的可能性更大。
简单说就是: 赋初始值时,已经满足 second > first ,现在找第三个数 third
- 如果 third 比 second 大,说明找到了,直接返回 true
- 如果 third 比 second 小,但是比 first 大,那就把 second 指向 third,然后继续遍历找 third
- 如果 third 比 first 还小,那就把 first 指向 third,然后继续遍历找 third(这样的话,first 会跑到 second 的后边,但是不要紧,因为在 second 的前边,旧 first 还是满足的)
|
|