方法一:动态规划 时间复杂度O(n2)
class Solution { public int wiggleMaxLength(int[] nums) { int n = nums.length; if(n == 0) return 0; int[][] dp = new int[n+1][2];// 0上升 1下降 dp[1][0] = 1; dp[1][1] = 1; int res = 1; for(int i = 2; i <= n; i++) { for(int j = 1; j < i; j++) { if(nums[i-1] > nums[j-1]) { dp[i][0] = Math.max(dp[i][0],dp[j][1] + 1); } if(nums[i-1] < nums[j-1]) { dp[i][1] = Math.max(dp[i][1],dp[j][0] + 1); } res = Math.max(res,Math.max(dp[i][0],dp[i][1])); } } return res; } }
方法二:贪心
每个位置上数的上升或下降与之前的最大上升和下降有关
class Solution { public int wiggleMaxLength(int[] nums) { int n = nums.length; if(n < 2) return n; int up = 1, down = 1; for(int i = 1; i < n; i++) { if(nums[i] > nums[i-1]) up = down + 1; if(nums[i] < nums[i-1]) down = up + 1; } return Math.max(up,down); } }