题目
给你一个长度为 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
具体代码
class Solution:
def isTrionic(self, nums: List[int]) -> bool:
n = len(nums)
if n < 3:
return False
# 定义状态常量
STATE_UP1 = 1
STATE_DOWN = 2
STATE_UP2 = 3
# 初始检查:必须以上升开始
if nums[1] <= nums[0]:
return False
# 初始化状态
current_state = STATE_UP1
# 从第 2 个元素开始遍历 (索引 1 已经被初始检查覆盖,但放在循环里统一处理也可以,这里从索引 2 开始对比)
# 为了逻辑清晰,我们从 i=2 开始遍历,对比 nums[i] 和 nums[i-1]
# 因为我们已经确认了 nums[0] -> nums[1] 是 UP1 状态
for i in range(2, n):
curr = nums[i]
prev = nums[i-1]
if current_state == STATE_UP1:
if curr > prev:
continue # 继续爬坡
elif curr < prev:
current_state = STATE_DOWN # 峰值出现,转入下坡
else:
return False # 相等,非法
elif current_state == STATE_DOWN:
if curr < prev:
continue # 继续下坡
elif curr > prev:
current_state = STATE_UP2 # 谷底出现,转入第二段爬坡
else:
return False # 相等,非法
elif current_state == STATE_UP2:
if curr > prev:
continue # 继续爬坡
else:
return False # 下降或相等,非法
# 最终必须处于完成“三段”的状态
return current_state == STATE_UP2