力扣376题(摆动序列)

376、摆动序列

基本思想:

贪心算法

具体实现:

preDiff存放上一次的差值

curDiff存放当前的差值

只要一正一负,执行count + +

但是preDiff初始化为0,不管怎样比都不会出现一正一负,

所以比较条件为

if ((curDiff > 0 && preDiff <= 0) || (curDiff < 0 && preDiff >= 0))

比较preDiff时需要带等号

 

一个数组长度为2 ,

举例,[2,5],摆动序列的最长子序列个数应该返回2

count初始化为1

此时curDiff > 0 && preDiff <= 0,

count++ ,

最后得到的count就是2

 

[4,5,5,4]

返回3,

代码:

class Solution {
    public int wiggleMaxLength(int[] nums) {
        if (nums == null || nums.length <= 1) {
            return nums.length;
        }
        //当前差值
        int curDiff = 0;
        //上一个差值
        int preDiff = 0;
        int count = 1;
        for (int i = 1; i < nums.length; i++) {
            //得到当前差值
            curDiff = nums[i] - nums[i - 1];
            //如果当前差值和上一个差值为一正一负
            //等于0的情况表示初始时的preDiff
            if ((curDiff > 0 && preDiff <= 0) || (curDiff < 0 && preDiff >= 0)) {
                count++;
                preDiff = curDiff;
            }
        }
        return count;
    }
}

 

 

动态规划:

class Solution {
    public int wiggleMaxLength(int[] nums) {
        // 0 i 作为波峰的最大长度
        // 1 i 作为波谷的最大长度
        int dp[][] = new int[nums.length][2];

        dp[0][0] = dp[0][1] = 1;
        for (int i = 1; i < nums.length; i++){
            //i 自己可以成为波峰或者波谷
            dp[i][0] = dp[i][1] = 1;

            for (int j = 0; j < i; j++){
                if (nums[j] > nums[i]){
                    // i 是波谷
                    dp[i][1] = Math.max(dp[i][1], dp[j][0] + 1);
                }
                if (nums[j] < nums[i]){
                    // i 是波峰
                    dp[i][0] = Math.max(dp[i][0], dp[j][1] + 1);
                }
            }
        }

        return Math.max(dp[nums.length - 1][0], dp[nums.length - 1][1]);
    }
}

 

posted @ 2021-10-19 22:40  最近饭吃的很多  阅读(53)  评论(0编辑  收藏  举报