最长湍流子数组

122 阅读1分钟

给定一个整数数组 arr ,返回 arr 的 最大湍流子数组的长度 。

如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是 湍流子数组 。

更正式地来说,当 arr 的子数组 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]

示例 1:

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

示例 2:

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

示例 3:

输入:arr = [100] 输出:1

提示:

1 <= arr.length <= 4 * 104
0 <= arr[i] <= 109

这段代码首先 len(A),看看A的长度是否为 1,长度为1则直接返回 1,接着 max(A) 如果与 min(A) 相等则表示 A 数组全部数字都相同,也直接返回 1 然后设置 dp 列表长度为A的长度,值都为 1,接着量取A的长度,从 1 开始迭代。 这里说一下湍流子数组,题目所给出的定义看完之后,我发现可以中间的数字对比两边的数字,中间的数字要么都比两边的数字大,要么都比两边的数字小,这样才能构成子数组中的每个相邻元素对之间翻转,因此也就有了我下面的 if。 比对完之后,如果满足,可以将 dp[i-1]+1 得到 dp[i] 的值,因为是逐渐增加到这个过程。 最后输出 max(dp)+1,为什么要加 1 呢,有两种情况 1.因为有对比存在某个中间数字不满足条件,但是中间数字的前面一个数字满足,那么 +1 就是表示把这个中间数字加上去。 2如果全部都满足条件,因为最后一个数字我是没有对比的(设置为 0),所以如果最后一个数字的前面一个数字满足,同样要加 1,才能得到正确答案

class Solution:
    def maxTurbulenceSize(self, arr: List[int]) -> int:
        length = len(arr)
        if length == 1:
            return 1
        left, right = 0, 1
        ans = -1
        while right < length:
            if right < length - 1 and (arr[right] - arr[right - 1]) * (arr[right] - arr[right + 1]) > 0:
                right += 1
            else:
                if arr[right] == arr[right - 1]:
                    ans = max(ans, right - left)
                else:
                    ans = max(ans, right - left + 1)
                left = right
                right += 1
        return ans
```
```