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
- 如果相邻的两个元素相等直接跳过
- 最后判断上升摆动序列和下降摆动序列哪个序列长,就会得到摆动序列的最长子序列
总结:一种优化的动态规划算法。