📅  最后修改于: 2023-12-03 15:11:40.459000             🧑  作者: Mango
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)$。