题目
题解
-
状态定义:up[i] 表示以前 i 个元素中的某一个为结尾的最长的「上升摆动序列」的长度;down[i] 表示以前 i 个元素中的某一个为结尾的最长的「下降摆动序列」的长度
-
状态转移方程:
-
初始条件:dp[0]=dp[1]=1
-
返回值:max(up[n−1] ,down[n-1])
class Solution {
public int wiggleMaxLength(int[] nums) {
int n=nums.length;
int up[]=new int[n];
int down[]=new int[n];
up[0]=down[0]=1;
for(int i=1;i<n;i++){
//上升
if(nums[i]>nums[i-1]){
up[i]=Math.max(up[i-1],down[i-1]+1);
down[i]=down[i-1];
}
//下降
else if(nums[i]<nums[i-1]){
up[i]=up[i-1];
down[i]=Math.max(up[i-1]+1,down[i-1]);
}
//没变
else{
up[i]=up[i-1];
down[i]=down[i-1];
}
}
return Math.max(up[n-1],down[n-1]);
}
}
时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n),可通过滚动数组优化为O(1)