题目链接
这里可以做两种dp 一种二维数组dpi;
dpi表示上升,dpi表示下降
或者干脆定义两个dp数组,一个up,一个down分别表示一个是上升序列的最大长度,一个是下降序列的最大长度,如果对于每个i如果是上升下列就只要在最大的下降序列的基础上+1,如果是下降序列就是只要在最长的上升序列上+1
而且我们仅仅需要O(n)的时间复杂度就可以解决问题,因为对于每个i来说,如果是上升的那么他的最长下降序列就是前i的下降序列,如果是下降的那么他的最长上升序列就前i的上升序列
![](https://www.noah-dream.com/usr/uploads/2020/04/965464647.png)
public int wiggleMaxLength(int[] nums) {
if(nums.length<2) {
return nums.length;
}
int[] up=new int [nums.length];
int[] down=new int [nums.length];
up[0]=down[0]=1;
for(int i=1;i<nums.length;i++) {
for(int j=0;j<i;j++) {
if(nums[i]>nums[i-1]) {
up[i]=down[i-1]+1;
down[i]=down[i-1];
}else if(nums[i]<nums[i-1]) {
down[i]=up[i-1]+1;
up[i]=up[i-1];
}else {
down[i]=down[i-1];
up[i]=up[i-1];
}
}
}
return Math.max(up[nums.length-1], down[nums.length-1]);
}