
「摆动序列」(LeetCode 376)知识点总结
一、题目核心定义与要求
- 摆动序列 :如果连续数字之间的差值严格地在正数和负数之间交替 ,则该序列为摆动序列。
- 特例:仅包含1个元素 ,或包含2个不相等元素的序列,也视为摆动序列。
- 反例:差值连续为正(如
[1,4,7,2,5])、差值为0(如[1,7,4,5,5])的序列,都不是摆动序列。
- 子序列:可通过删除原序列中部分元素(或不删除)得到,且保持元素原有顺序。
- 目标 :给定整数数组
nums,返回其中最长摆动子序列的长度。
二、核心算法:贪心解法
1. 贪心思路
- 核心逻辑:最长摆动子序列的长度,等价于序列中波峰 + 波谷的数量 + 1(首尾元素默认算入)。
- 操作方式:遍历数组,统计相邻元素差值的正负变化次数,每次变化即对应一个波峰或波谷。
2. 关键细节
- 若相邻元素差值为
0(即连续相等),不产生波峰/波谷,直接跳过。 - 只需记录前一个差值的符号 ,与当前差值的符号对比:
- 若符号相反(正→负 或 负→正),则说明出现了波峰/波谷,计数加1。
- 初始时,若数组长度为
0或1,直接返回数组长度;若长度为2,返回2(只要两元素不等)。
三、示例解析
- 示例 1 :输入
[1,7,4,9,2,5]
差值序列为6, -3, 5, -7, 3,正负交替出现,因此整个序列是摆动序列,长度为6。 - 示例 2 :输入
[1,17,5,10,13,15,10,5,16,8]
差值序列为16, -12, 5, 3, 2, -5, -5, 11, -8,其中正负交替的有效变化有6次,因此最长摆动子序列长度为7。
四、其他解法:动态规划
- 维护两个状态数组:
up[i]:以nums[i]结尾的最长上升摆动子序列长度(最后一个差值为正)。down[i]:以nums[i]结尾的最长下降摆动子序列长度(最后一个差值为负)。
- 状态转移:
- 若
nums[i] > nums[i-1],则up[i] = down[i-1] + 1,down[i] = down[i-1]。 - 若
nums[i] < nums[i-1],则down[i] = up[i-1] + 1,up[i] = up[i-1]。 - 若相等,
up[i] = up[i-1],down[i] = down[i-1]。
- 若
- 最终结果为
max(up[n-1], down[n-1])。