算法训练|摆动序列(贪心算法)

在这里插入图片描述在这里插入图片描述
思路:给数组中的每一个元素设置一个状态,有begin,up,down三种状态,如果规定状态转换的位置成为【峰】和【谷】,那么,状态转换一次,则子序列的长度++,即【峰】和【谷】的总和就是子序列的长度。
在这里插入图片描述
代码:

class Solution {
    
    
    public int wiggleMaxLength(int[] nums) {
    
    
        //如果数组的长度小于等于1的话,那么摆动序列的个数和数组元素的个数一致
        if(nums.length<=1){
    
    
            return nums.length;
        }
        //设置初始状态,采用状态机的思想编程
        //设置初始状态,采用状态机的思想编程
        //switch语句中判断的值必须为一个常量,用final定义状态
        final int begin = 0;
        final int up = 1;
        final int down = 2;
        int state = begin;
        int maxlength = 1;
        //因为第一个元素是可以不用去理会的,因此从下标1开始判断
        for (int i = 1; i < nums.length; i++) {
    
    
            switch (state){
    
    
                case begin:
                    if(nums[i-1]-nums[i]<0){
    
    
                    //改变状态
                        state = up;
                        maxlength++;
                    }else if(nums[i-1]-nums[i]>0){
    
    
                    //改变状态
                        state = down;
                        maxlength++;
                    }
                    break;
                case up:
                    if(nums[i-1]-nums[i]>0){
    
    
                    //改变状态
                        state = down;
                        maxlength++;
                    }
                    break;
                case down:
                //改变状态
                    if(nums[i-1]-nums[i]<0){
    
    
                        state = up;
                        maxlength++;
                    }
                    break;
            }
        }
        return maxlength;
    }
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45394002/article/details/111667819