《Leetcode of December》376.摆动序列

class Solution:
    def wiggleMaxLength(self, nums: List[int]) -> int:
        if len(nums)<2:
            return len(nums)
        down,up=1,1
        #down:下降摆动序列:序列是摆动序列且最后一个元素是小于前一个元素的
        #up:上升摆动序列:序列是摆动序列且最后一个元素是大于前一个元素的
        
        for i in range(1,len(nums)):
            #如果后一个元素大于前一个元素,那么上升摆动序列=下降摆动序列+1
            if nums[i]>nums[i-1]:
                up = down+1
            #如果后一个元素小于前一个元素,那么下降摆动序列=上升摆动序列+1
            elif nums[i]<nums[i-1]:
                down = up+1
            #如果相等直接跳过
            else:
                continue
        #最后判断上升摆动序列长度大还是下降摆动序列长度大
        return max(up,down)
  • 所谓的摆动序列就是两数之差的正负是相间的,比如:1,4,3,5
  • 寻找摆动序列最长的子序列,从这个要求就可以看到应该是要用动态规划的思想
  • 初始化两个摆动序列
    • 上升摆动序列
      • 这个序列是摆动序列,且最后两个数之差是大于0
    • 下降摆动序列 
      • 这个序列是摆动序列,且最后两个数之差是小于0
  • 遍历整个数组
    • 如果后一个元素大于前一个元素,那么上升摆动序列=下降摆动序列+1
    • 如果后一个元素小于前一个元素,那么下降摆动序列=上升摆动序列+1
    • 如果相邻的两个元素相等直接跳过
  • 最后判断上升摆动序列和下降摆动序列哪个序列长,就会得到摆动序列的最长子序列

总结:一种优化的动态规划算法。

猜你喜欢

转载自blog.csdn.net/weixin_37724529/article/details/111057494