📜  给定数组的最长ZigZag子数组的长度(1)

📅  最后修改于: 2023-12-03 15:11:40.459000             🧑  作者: Mango

给定数组的最长ZigZag子数组的长度

ZigZag子数组是指数组中元素的相邻关系呈现交替升降的状态。

例如给定数组 [1, 7, 4, 9, 2, 5],其中 [1, 7, 4][7, 4, 9, 2] 都是 ZigZag 子数组。但最长的 ZigZag 子数组是 [1, 7, 4, 9, 2],长度为 5。

本文介绍如何使用动态规划技术解决给定数组的最长ZigZag子数组的长度问题。

动态规划

我们设 $up_i$ 表示以第 $i$ 个元素为结尾的最长上升子数组的长度,$down_i$ 表示以第 $i$ 个元素为结尾的最长下降子数组的长度。则对于第 $i$ 个元素,它可以与前一个元素形成上升或下降的形态。若当前元素与前一个元素形态相同,则无法形成 ZigZag 子数组;若当前元素与前一个元素形态不同,则可以将前一个元素纳入 ZigZag 子数组。

因此,我们可以根据前一个元素的状态来更新当前元素的 $up$ 和 $down$ 值。如果当前元素比前一个元素大,则 $up_i = down_{i-1} + 1$;如果当前元素比前一个元素小,则 $down_i = up_{i-1} + 1$。

最终的答案是 $\max(up_i, down_i)$。

代码实现
def longest_zigzag_subarray(arr):
    n = len(arr)
    up, down = [1] * n, [1] * n
    for i in range(1, n):
        if arr[i] > arr[i-1]:
            up[i] = down[i-1] + 1
            down[i] = down[i-1]
        elif arr[i] < arr[i-1]:
            down[i] = up[i-1] + 1
            up[i] = up[i-1]
    return max(up[-1], down[-1])
性能分析

时间复杂度 $O(n)$,空间复杂度 $O(n)$。