跳转至

LeetCode: 978. 最长湍流子数组

1、题目描述

A 的子数组 A[i], A[i+1], ..., A[j] 满足下列条件时,我们称其为湍流子数组:

  • i <= k < j,当 k 为奇数时, A[k] > A[k+1],且当 k 为偶数时,A[k] < A[k+1]
  • 或 若 i <= k < j,当 k 为偶数时,A[k] > A[k+1] ,且当 k 为奇数时, A[k] < A[k+1]。 也就是说,如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是湍流子数组。

返回 A 的最大湍流子数组的长度。

示例 1:

输入:[9,4,2,10,7,8,8,1,9]
输出:5
解释:(A[1] > A[2] < A[3] > A[4] < A[5])

示例 2:

输入:[4,8,12,16]
输出:2

示例 3:

输入:[100]
输出:1

提示:

  • 1 <= A.length <= 40000
  • 0 <= A[i] <= 10^9

2、解题思路

  • 直接使用两种匹配模式向后匹配即可
  • 模式1保存匹配到符合条件一的,从前方到当前位置的最大长度
  • 模式2保存匹配到符合条件二的,从前方到当前位置的最大长度
class Solution:
    def maxTurbulenceSize(self, A: List[int]) -> int:
        pattern1 = 1
        pattern2 = 1
        ans = 1

        for i in range(1, len(A)):
            if i % 2:
                if A[i] < A[i - 1]:
                    pattern1 += 1
                else:
                    pattern1 = 1

                if A[i] > A[i - 1]:
                    pattern2 += 1
                else:
                    pattern2 = 1
            else:
                if A[i] > A[i - 1]:
                    pattern1 += 1
                else:
                    pattern1 = 1

                if A[i] < A[i - 1]:
                    pattern2 += 1
                else:
                    pattern2 = 1

            ans = max(ans, pattern1, pattern2)

        return ans