12/12 动态规划 设定up和down两个变量分别存储尾部上升和尾部下降的最长子序列 如果当前元素比前一个元素大,up=down+1 对前一个元素,一定有以前一个元素结尾的长度为down的尾部下降子序列, 再接上当前元素,就能成为一个尾部上升的子序列,用这个值去更新up 同理若当前元素比前一个元素小,用up+1去更新down class Solution { public int wiggleMaxLength(int[] nums) { int n = nums.length; if (n < 2) { return n; } int up = 1; int down = 1; for (int i = 1; i < n; 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); } } 贪心 如果将给的数组放到一个二维平面上,很容易发现要求山峰和山谷的总个数。 class Solution { public int wiggleMaxLength(int[] nums) { if (nums.length <2 ) return nums.length; int curDiff = 0; // 当前一对差值 int preDiff = 0; // 前一对差值 int ans = 1; // 记录峰值个数,序列默认序列最右边有一个峰值 for (int i = 1; i < nums.length; i++) { curDiff = nums[i] - nums[i - 1]; // 出现峰值 if ((curDiff > 0 && preDiff <= 0) || (preDiff >= 0 && curDiff < 0)) { ans++; preDiff = curDiff; } } return ans; } }