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); } }