欢迎来到飞鸟慕鱼博客,开始您的技术之旅!
当前位置: 首页知识笔记正文

三元有序数组,递增三元组个数

终极管理员 知识笔记 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    }
总结

再简单再复杂也要手敲一遍否则有些细节你终究是抓不住的。

人生感觉还可以再搏一搏

标签:
声明:无特别说明,转载请标明本文来源!