1. LeetCode 376. 摆动序列
该问题要求找出最长的摆动子序列,即相邻元素差值正负交替。核心在于识别极值点(波峰或波谷),因为只有在极值处切换方向才能保留最多的后续选择空间。

思路分析
我们需要在遍历过程中判断当前点是否为极值。如果连续三个点呈现单调趋势,中间的点就不是极值;只有当差值符号发生变化时,才说明遇到了拐点。代码中通过记录前一个差值和当前差值的乘积来判断符号是否改变。若 left * right < 0,说明符号相反,计数加一。注意处理数组长度较小或首尾相同的情况。
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
int left = 0;
int right = 0;
int sz = nums.size();
int ret = 0;
if (sz == 1 || (sz == 2 && nums[0] == nums[1])) return 1;
if ((nums[0] == nums[sz - 1]) && (nums[0] == nums[sz / 2])) return 1;
for (int i = 0; i < sz - 1; ++i) {
right = nums[i + 1] - nums[i];
if (!right) continue;
if ((left * right) < ) {
ret++;
}
left = right;
}
ret + ;
}
};





