LeetCode376. 摆动序列

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

 

posted @ 2021-01-12 11:15  不学无墅_NKer  阅读(65)  评论(0编辑  收藏  举报