摆动序列,力扣。
动态规划解法
这个解法是dynamic programming的方法,主要的思想就是观察其结构,发现是一个波峰和波谷的结构
我们只需要设置两个dp的一维数组就可以了:
dp_up[]:用于存储上升序列的数量
dp_down[]:用于存储下降序列的数量
- 二者的转化规律是如果num[i]>num[i-1],就是进入了上升区间,那么我们只要把dp_down[i-1]的值+1就可以了,反之亦然,
- 如果出现连续上升或者下降会如何处理,实际上是一样处理的,在连续上升的时候,只有up在变,而down是不变的,所以dp_down[i-1]的值+1的值是一直不变的,
- 相等的时候都不变,
- 最后的时候怎么办,最后需要选出up和down里面较大的那一个值,因为我们不知道最后一个值是给了down还是up
代码如下啦:
class Solution:
def wiggleMaxLength(self, nums: list[int]) -> int:
n = len(nums)
if n < 2:
return n
dp_up = [0]*(n)
dp_down = [0]*(n)
dp_up[0]=1
dp_down[0]=1
for i in range(1,n):
if nums[i]>nums[i-1]:
dp_up[i] = dp_down[i-1]+1
dp_down[i] = dp_down[i-1]
elif nums[i]<nums[i-1]:
dp_down[i] = dp_up[i-1]+1
dp_up[i] = dp_up[i-1]
else:
dp_up[i] = dp_up[i-1]
dp_down[i] = dp_down[i-1]
return max(dp_up[-1],dp_down[-1])