一个整数序列,如果两个相邻元素的差恰好正负(或负正)交替出现,则该序列被称为摇摆序列。显然,一个小于2个元素的序列直接为摇摆序列。给定一个随机序列,若其不满足摇摆序列定义,则从中删除若干元素,使其剩余元素构成最长摇摆子序列,输出该最长摇摆子序列的长度
时间: 2024-03-12 19:44:34 浏览: 217
这是一个经典的动态规划问题,可以使用两个数组 up 和 down 分别记录以 i 结尾的最长上升子序列长度和最长下降子序列长度。
具体来说,对于序列中的第 i 个元素,如果其比前一个元素大,则可以将 up[i] 更新为 down[i-1]+1,因为前一个元素必须是下降的,而当前元素是上升的,可以组成一个摇摆子序列。
同理,如果第 i 个元素比前一个元素小,则可以将 down[i] 更新为 up[i-1]+1。
最后,最长摇摆子序列的长度即为 up 和 down 数组中的最大值。
下面是 Python 代码实现:
```python
def wiggleMaxLength(nums: List[int]) -> int:
n = len(nums)
if n < 2:
return n
up = [1] * n
down = [1] * n
for i in range(1, n):
if nums[i] > nums[i-1]:
up[i] = down[i-1] + 1
down[i] = down[i-1]
elif nums[i] < nums[i-1]:
down[i] = up[i-1] + 1
up[i] = up[i-1]
else:
up[i] = up[i-1]
down[i] = down[i-1]
return max(up[-1], down[-1])
```
注意,这里的时间复杂度为 O(n),空间复杂度为 O(n),其中 n 是序列的长度。
阅读全文