
class Solution {
/**
* 最优子结构:在i处递减的摆动序列的总长度,就是在i之前以递增结尾的最长摆动序列长度 +1;
* 状态定义:up[i] 表示以前 i 个元素中的某一个为结尾的最长的 上升摆动序列 的长度
* down[i] 表示以前 i 个元素中的某一个为结尾的最长的 下降摆动序列 的长度
*/
public int wiggleMaxLength(int[] nums) {
/**
* 方法1:时间复杂度:O(n) 空间复杂度:O(n)
*/
/*
int len = nums.length;
// 规定少于两个元素的序列也是摆动序列
if (len < 2) {
return len;
}
int[] up = new int[len];
int[] down = new int[len];
up[0] = down[0] = 1;
for (int i = 1; i < len; i++) {
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 { // 如果相等,都不变
up[i] = up[i-1];
down[i] = down[i-1];
}
}
return Math.max(up[len-1], down[len-1]);
*/
/**
* 方法2:空间压缩。 时间复杂度:O(n) 空间复杂度:O(1)
*/
int len = nums.length;
if (len < 2) {
return len;
}
int up = 1, down = 1;
for (int i = 1; i < len; i++) {
if (nums[i] > nums[i-1]) {
up = down + 1;
}else if (nums[i] < nums[i-1]) {
down = up + 1;
}
}
return Math.max(up, down);
}
}