LeetCode 题解工作台

最长湍流子数组

给定一个整数数组 arr ,返回 arr 的 最大湍流子数组的 长度 。 如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是 湍流子数组 。 更正式地来说,当 arr 的子数组 A[i], A[i+1], ..., A[j] 满足仅满足下列条件时,我们称其为 湍流子数组 : 若 i : 当…

category

3

题型

code_blocks

6

代码语言

hub

3

相关题

当前训练重点

中等 · 状态·转移·动态规划

bolt

答案摘要

我们定义 表示以 结尾且结尾处于上升状态的最长湍流子数组的长度,定义 表示以 结尾且结尾处于下降状态的最长湍流子数组的长度。初始时 $f[0] = 1$, $g[0] = 1$。答案为 $\max(f[i], g[i])$。 对于 $i \gt 0$,若 $\textit{nums}[i] \gt \textit{nums}[i - 1]$,则 $f[i] = g[i - 1] + 1$,…

Interview AiBox logo

Interview AiBox 实时 AI 助手,陪你讲清 状态·转移·动态规划 题型思路

试试 AiBox 面试助手arrow_forward
description

题目描述

给定一个整数数组 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
lightbulb

解题思路

方法一:动态规划

我们定义 f[i]f[i] 表示以 nums[i]\textit{nums}[i] 结尾且结尾处于上升状态的最长湍流子数组的长度,定义 g[i]g[i] 表示以 nums[i]\textit{nums}[i] 结尾且结尾处于下降状态的最长湍流子数组的长度。初始时 f[0]=1f[0] = 1, g[0]=1g[0] = 1。答案为 max(f[i],g[i])\max(f[i], g[i])

对于 i>0i \gt 0,若 nums[i]>nums[i1]\textit{nums}[i] \gt \textit{nums}[i - 1],则 f[i]=g[i1]+1f[i] = g[i - 1] + 1,否则 f[i]=1f[i] = 1;若 nums[i]<nums[i1]\textit{nums}[i] \lt \textit{nums}[i - 1],则 g[i]=f[i1]+1g[i] = f[i - 1] + 1,否则 g[i]=1g[i] = 1

由于 f[i]f[i]g[i]g[i] 只与 f[i1]f[i - 1]g[i1]g[i - 1] 有关,因此可以使用两个变量代替数组。

时间复杂度 O(n)O(n),其中 nn 为数组长度。空间复杂度 O(1)O(1)

1
2
3
4
5
6
7
8
9
10
class Solution:
    def maxTurbulenceSize(self, arr: List[int]) -> int:
        ans = f = g = 1
        for a, b in pairwise(arr):
            ff = g + 1 if a < b else 1
            gg = f + 1 if a > b else 1
            f, g = ff, gg
            ans = max(ans, f, g)
        return ans
speed

复杂度分析

指标
时间O(N)
空间O(1)
psychology

面试官常问的追问

外企场景
  • question_mark

    Focus on edge cases like repeated values or single-element arrays.

  • question_mark

    Expect clarification on handling the first element comparison and index parity.

  • question_mark

    Consider discussing the trade-off between sliding window and explicit DP arrays.

warning

常见陷阱

外企场景
  • error

    Failing to reset state when consecutive elements are equal, leading to incorrect subarray length.

  • error

    Confusing index parity with comparison direction, breaking the turbulence check.

  • error

    Using O(N^2) nested loops instead of linear state tracking, which is inefficient for large arrays.

swap_horiz

进阶变体

外企场景
  • arrow_right_alt

    Return the actual subarray instead of just its length, requiring backtracking of start and end indices.

  • arrow_right_alt

    Compute turbulent subarrays on a 2D grid flattened row-wise, combining row and column alternations.

  • arrow_right_alt

    Find maximum turbulent segments where only '>' alternates with '<=' instead of strict '<', changing state transitions slightly.

help

常见问题

外企场景

最长湍流子数组题解:状态·转移·动态规划 | LeetCode #978 中等