三元有序数组,递增三元组个数
终极管理员 知识笔记 120阅读
题目
给你一个整数数组 nums 判断这个数组中是否存在长度为 3 的递增子序列。
如果存在这样的三元组下标 (i, j, k) 且满足 i < j < k 使得 nums[i] < nums[j] < nums[k] 返回 true 否则返回 false 。

示例 1
输入nums [1,2,3,4,5]
输出true
解释任何 i < j < k 的三元组都满足题意
示例 2

输入nums [5,4,3,2,1]
输出false
解释不存在满足题意的三元组
示例 3
输入nums [2,1,5,0,4,6]
输出true
解释三元组 (3, 4, 5) 满足题意因为 nums[3] 0 < nums[4] 4 < nums[5] 6
提示
1 < nums.length < 5 * 105
-231 < nums[i] < 231 - 1
left 数组表示当前位置左侧的最小值right 数组表示当前位置右侧的最大值
只要满足任何位置当前位置的值大于左侧的最小值小于 右侧的最大值就满足条件了
fun increasingTriplet(nums: IntArray): Boolean { val size nums.size if (size < 3) { return false } val left IntArray(size) { Int.MAX_VALUE } val right IntArray(size) { Int.MIN_VALUE } left[0] nums[0] right[size - 1] nums[size - 1] //不用考虑等于的情况 for (i in 1 until size - 1) { left[i] nums[i].coerceAtMost(left[i - 1]) } for (i in size - 2 downTo 1) { right[i] nums[i].coerceAtLeast(right[i 1]) } for (i in 1 until size - 1) { if (nums[i] > left[i] && nums[i] < right[i]) { return true } } return false }
两个变量 first second0(n) 复杂度解决
fun increasingTriplet2(nums: IntArray): Boolean { //保存两个变量 val size nums.size if (size < 3) { return false } var first nums[0] var second Int.MAX_VALUE for (i in 1 until size) { if (nums[i] > second) { return true } else if (nums[i] > first) { second nums[i] } else { first nums[i] } } return false }
总结 再简单再复杂也要手敲一遍否则有些细节你终究是抓不住的。
人生感觉还可以再搏一搏
标签: