题目来源:LeetCode 376. 摆动序列
问题抽象: 给定一个整数数组 nums,需计算其 最长摆动子序列 的长度,满足以下核心需求:
-
摆动序列定义:
- 子序列中相邻元素的差值 严格交替变化(正→负→正 或 负→正→负);
- 若差值序列为
[d1, d2, d3, ...],则对所有i有d_i × d_{i+1} < 0(符号相反); - 单元素序列 视为有效摆动序列(长度
1); - 两元素不等序列 自动满足摆动条件(长度
2)。
-
优化目标:
- 子序列 不要求连续(可从原序列中删除部分元素);
- 在所有摆动子序列中,选择 元素数量最多 的子集长度;
- 利用 贪心策略:仅记录序列的波峰和波谷位置(忽略单调区间)。
-
边界处理:
- 空数组:返回
0; - 全等数组:如
[1,1,1]→ 最长摆动序列长度1(单元素); - 头尾处理:序列起始和结束元素无条件计入;
- 平坡处理:连续相等值(如
[1,2,2,3])中仅第一个2可能参与摆动。
- 空数组:返回
-
特殊案例:
[1,7,4,9,2,5]→ 差值[+6,-3,+5,-7,+3]符号交替 → 长度6;[1,17,5,10,13,15,10,5,16,8]→ 最长摆动子序列[1,17,5,15,5,16,8]→ 长度7;[1,2,3,4,5,6,7,8,9]→ 最长摆动序列为任意两个不等元素(如[1,2])→ 长度2

967

被折叠的 条评论
为什么被折叠?



