📅  最后修改于: 2023-12-03 15:41:17.244000             🧑  作者: Mango
ZigZag 数组是指数组中相邻元素的差别在正负之间交替变化,例如 [10, 5, 2, 7, 8, -2, 11, 4, -3, -8]
就是一个 ZigZag 数组。
一个 ZigZag 子数组用连续一段 ZigZag 数组表示,例如 [2, 7, 8]
就是 [10, 5, 2, 7, 8, -2, 11, 4, -3, -8]
的一个 ZigZag 子数组。
给定一个整数数组,求最长 ZigZag 子数组的长度。
令 dp[i][0]
表示以第 i
个元素作为该 ZigZag 子数组的结尾,差别为正;dp[i][1]
表示以第 i
个元素作为该 ZigZag 子数组的结尾,差别为负。则有:
nums[i] > nums[j]
(j < i
)时,dp[i][0] = max(dp[i][0], dp[j][1] + 1)
;nums[i] < nums[j]
(j < i
)时,dp[i][1] = max(dp[i][1], dp[j][0] + 1)
。最终答案为所有 dp[i][0]
和 dp[i][1]
中的最大值加 1(因为要包含第 i
个元素)。
def find_zigzag(nums):
n = len(nums)
dp = [[1, 1] for _ in range(n)]
ans = 1
for i in range(1, n):
for j in range(i):
if nums[i] > nums[j]:
dp[i][0] = max(dp[i][0], dp[j][1] + 1)
elif nums[i] < nums[j]:
dp[i][1] = max(dp[i][1], dp[j][0] + 1)
ans = max(ans, max(dp[i]))
return ans
该算法的时间复杂度为 $O(n^2)$,空间复杂度为 $O(n)$。优化空间复杂度需要注意到 dp[i][0]
和 dp[i][1]
只与 dp[j][0]
、dp[j][1]
、nums[i]
和 nums[j]
相关,因此可以使用滚动数组进行空间优化。