376. 摆动序列

 方法一:动态规划 时间复杂度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);
    }
}
原文地址:https://www.cnblogs.com/yonezu/p/13397841.html