思路:给数组中的每一个元素设置一个状态,有begin,up,down三种状态,如果规定状态转换的位置成为【峰】和【谷】,那么,状态转换一次,则子序列的长度++,即【峰】和【谷】的总和就是子序列的长度。
代码:
class Solution {
public int wiggleMaxLength(int[] nums) {
//如果数组的长度小于等于1的话,那么摆动序列的个数和数组元素的个数一致
if(nums.length<=1){
return nums.length;
}
//设置初始状态,采用状态机的思想编程
//设置初始状态,采用状态机的思想编程
//switch语句中判断的值必须为一个常量,用final定义状态
final int begin = 0;
final int up = 1;
final int down = 2;
int state = begin;
int maxlength = 1;
//因为第一个元素是可以不用去理会的,因此从下标1开始判断
for (int i = 1; i < nums.length; i++) {
switch (state){
case begin:
if(nums[i-1]-nums[i]<0){
//改变状态
state = up;
maxlength++;
}else if(nums[i-1]-nums[i]>0){
//改变状态
state = down;
maxlength++;
}
break;
case up:
if(nums[i-1]-nums[i]>0){
//改变状态
state = down;
maxlength++;
}
break;
case down:
//改变状态
if(nums[i-1]-nums[i]<0){
state = up;
maxlength++;
}
break;
}
}
return maxlength;
}
}