代码展示
class Solution { public: int wiggleMaxLength(vector<int>& nums) { if (nums.size() <= 1) return nums.size(); // 如果数组长度小于等于1,返回数组长度 int curdiff = 0; // 当前元素和前一个元素的差值 int prediff = 0; // 前一个差值 int result = 1; // 最长摇摆子序列的长度,初始化为1,因为至少有一个元素 for (int i = 0; i < nums.size() - 1; i++) { curdiff = nums[i + 1] - nums[i]; // 计算当前元素和下一个元素的差值 // 如果当前差值和前一个差值符号不同(包括第一次比较的情况),并且当前差值不为0 if ((prediff <= 0 && curdiff > 0) || (prediff >= 0 && curdiff < 0)) { result++; // 摇摆子序列长度加1 prediff = curdiff; // 更新前一个差值为当前差值 } } return result; // 返回最长摇摆子序列的长度 } };
代码核心思想
处理特殊情况:
- 如果数组长度小于等于1,直接返回数组长度,因为这种情况下,摇摆子序列的长度就是数组本身的长度。
初始化变量:
curdiff
:当前元素和前一个元素的差值。prediff
:前一个差值,用于记录上一次的差值。result
:结果,表示最长摇摆子序列的长度,初始值为1,因为至少有一个元素可以作为摇摆子序列的一部分。遍历数组:
- 从数组的第一个元素开始,逐个计算当前元素和下一个元素的差值 (
curdiff
)。- 如果当前差值和前一个差值的符号不同(即一个正一个负),或者当前差值是第一个差值:
- 增加结果
result
的值。- 更新前一个差值
prediff
为当前差值curdiff
。返回结果:
- 返回计算得到的最长摇摆子序列的长度。