Leetcode Link: 376. 摆动序列 - 力扣(LeetCode)
题目
如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为 摆动序列 。第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。
例如, [1, 7, 4, 9, 2, 5] 是一个 摆动序列 ,因为差值 (6, -3, 5, -7, 3) 是正负交替出现的。
相反,[1, 4, 7, 2, 5] 和 [1, 7, 4, 5, 5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。
子序列可以通过从原始序列中删除一些(也可以不删除)元素来获得,剩下的元素保持其原始顺序。
给你一个整数数组 nums ,返回 nums 中作为 摆动序列 的 最长子序列的长度 。

解法一
思路: 贪心算法 这道题其实想起来之后不知道属于贪心,就是感觉这样做是对的 前提是这道题不需要知道子序列内容,就是问长度,那就好办了
遍历数组,记录相邻两位的变化方向(用 -1 和 +1 来表示),每次遇到同方向,长度不变,遇到反方向,说明是摆动的,摆动数组长度加一
想法
实际上就是每次遇到同方向变动的,我就把后一个扔出去(扔前一个不能保证当前一个方向不变了,听不懂画图),让指针走过的地方都是摆动的,这样实际上就是最大(不会证,自己画图想想);换句话说,我只需要统计所有的跳变次数即可 好在本题不要求求子序列内容,所以这个过程就没有编程。
需要注意的本题的特例,以及跳变次数和摆动长度的关系

题解:
class Solution:
def wiggleMaxLength(self, nums: List[int]) -> int:
# 特例
if len(nums)== 0 or len(nums) == 1:
return len(nums)
# 前后两个指针赋值
pre = 0
p = 1
### 先找到不相等的前两个数
# 要是全都相等,则摆动序列长度为1,如[3,3,3,3]
while(1):
if nums[pre] != nums[p]:
break
if p == len(nums)-1:
return 1
pre+=1
p+=1
# flag 表示上次的跳变方向
flag = -float('inf')
jump_cnt = 0 # 跳变次数
while(p<len(nums)):
# 前后位置相等,没跳变,指针走,没别的操作
if nums[p]==nums[pre]:
p += 1
pre += 1 # 不变
continue
# 当前相邻位置数值变化方向
tmp = 1 if nums[p] > nums[pre] else -1
if flag != tmp:
# 和上次变化方向不同,跳变次数加
# 和上次变化方向相同,跳变次数不加,指针走
jump_cnt += 1
flag = tmp
p += 1
pre += 1
return jump_cnt+1代码实际上可以进一步精简
解法二
思路:
题解:
解法三
思路:
题解: