3637. 三段式数组 I
题目描述
给你一个长度为 n
的整数数组 nums
。
如果存在索引 0 < p < q < n − 1
,使得数组满足以下条件,则称其为 三段式数组(trionic):
nums[0...p]
严格 递增,nums[p...q]
严格 递减,nums[q...n − 1]
严格 递增。
如果 nums
是三段式数组,返回 true
;否则,返回 false
。
示例 1:
输入: nums = [1,3,5,4,2,6]
输出: true
解释:
选择 p = 2
, q = 4
:
nums[0...2] = [1, 3, 5]
严格递增 (1 < 3 < 5
)。nums[2...4] = [5, 4, 2]
严格递减 (5 > 4 > 2
)。nums[4...5] = [2, 6]
严格递增 (2 < 6
)。
示例 2:
输入: nums = [2,1,3]
输出: false
解释:
无法选出能使数组满足三段式要求的 p
和 q
。
提示:
3 <= n <= 100
-1000 <= nums[i] <= 1000
解法
方法一:一次遍历
我们首先定义一个指针 \(p\),初始时 \(p = 0\),表示当前指向数组的第一个元素。我们将 \(p\) 向右移动,直到找到第一个不满足严格递增的元素,即 \(nums[p] \geq nums[p + 1]\)。如果此时 \(p = 0\),说明数组的前半部分没有严格递增的部分,因此直接返回 \(\text{false}\)。
接下来,我们定义另一个指针 \(q\),初始时 \(q = p\),表示当前指向数组的第二个部分的第一个元素。我们将 \(q\) 向右移动,直到找到第一个不满足严格递减的元素,即 \(nums[q] \leq nums[q + 1]\)。如果此时 \(q = p\) 或者 \(q = n - 1\),说明数组的第二部分没有严格递减的部分或者没有第三部分,因此直接返回 \(\text{false}\)。
如果以上条件都满足,说明数组是三段式的,返回 \(\text{true}\)。
时间复杂度 \(O(n)\),其中 \(n\) 是数组的长度。空间复杂度 \(O(1)\),只使用了常数级别的额外空间。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|