376. 摆动序列
题目来源:力扣(LeetCode)
https://leetcode-cn.com/problems/wiggle-subsequence/
解题思路:
依次遍历数组中的每一个元素,判断当前元素差值 nums[i]-nums[i-1] 与上一次差值 nums[i-1]-nums[i-2] 是否异号,是,则摆动子序列长度加1,并且保存当前元素差值用于与下一个元素差值比较;否,则直接跳过,遍历下一个元素。
即使用贪心算法,只要碰到两次差值异号就将摆动子序列的长度加1。
代码:
public int wiggleMaxLength(int[] nums) {
// 如果数组长度小于2,直接输出该长度为摆动子序列长度。
if(nums.length < 2){
return nums.length;
}
// 否则数组长度一定为2以上,计算前两个元素的差值。
int prediff = nums[1] - nums[0];
// 前两个元数的差值可能为零,说明第一个与第二个元素相同,摆动子序列为1,否则为2.
int count = prediff != 0 ? 2 : 1;
// 从第三个元素进入循环
for (int i = 2; i < nums.length; i++) {
// 当前元素与上一个元素的差值
int diff = nums[i] - nums[i-1];
// 判断当前差值与上一次差值是否异号,这个等号只用于第一二两个元素差值作为历史差值进行判断是否进入循环,以后不会用上。
// 若异号,摆动子序列加1,当前差值符号作为历史差值与下一个元素差值比较,
// 不异号,当前差值与上一次差值同号,继续作为历史差值与下一个元素差值比较。
if (diff < 0 && prediff >= 0 || diff > 0 && prediff <= 0){
count++;
prediff = diff;
}
}
return count ;
}