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 = 2q = 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