摆动序列,力扣。

动态规划解法

这个解法是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])
posted @ 2022-10-16 18:17  从未用过的回调函数  阅读(33)  评论(0)    收藏  举报