376. 摆动序列

376. 摆动序列

  • 原题链接:
  • 完成情况:
  • 解题思路:
  • 参考代码:
    • _376摆动序列
    • _376摆动序列
  • 错误经验吸取

原题链接:

376. 摆动序列

https://leetcode.cn/problems/wiggle-subsequence/description/

完成情况:

376. 摆动序列_第1张图片

解题思路:

    //就是贪心,上升的时候,选取上升数中的较大值
    //        下降的时候,选取下降数中的较小值
    //然后因为是摆荡数列嘛,就是要开局确认一下是先递增,还是先递减

参考代码:

_376摆动序列

package 代码随想录.贪心算法;

public class _376摆动序列 {
    /**
     *
     * @param nums
     * @return
     */
    public int wiggleMaxLength(int[] nums) {
        //就是贪心,上升的时候,选取上升数中的较大值
        //        下降的时候,选取下降数中的较小值
        //然后因为是摆荡数列嘛,就是要开局确认一下是先递增,还是先递减
        if (nums.length <= 1){
            return nums.length;
        }
//        //看增减顺序
//        boolean flag = true;    //true增 ,false减
        //当前差值
        int curDiff = 0;
        //上一个差值
        int prevDiff = 0;
//        int preA = nums[0];
//        int preB = nums[1];
//        if (preB - preA < 0){
//            //先减
//            flag = false;
//        }
//        int maxValue = preB;
//        for (int i=2;i< nums.length;i++){
//            if (flag = )
//
//        }
        int count = 1;
        for (int i = 1; i < nums.length; i++){
            //得到当前差值
            curDiff = nums[i] - nums[i-1];
            //如果当前差值和上一个差值为一正一负
            //等于0的情况表示初始时的preDiff
            if ((curDiff > 0 && prevDiff <= 0) || (curDiff < 0 && prevDiff >= 0)){
                count++;
                prevDiff = curDiff;
            }
        }
        return count;
    }
}

_376摆动序列

package 代码随想录.动态规划;

import java.util.Map;

public class _376摆动序列 {
    /**
     *
     * @param nums
     * @return
     */
    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 = 0; 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[i][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]);
    }
}

错误经验吸取

你可能感兴趣的:(java学习,算法知识,#,LeetCode题解,java,排序算法,链表,算法,数据挖掘)