力扣 376. 摆动序列

题目来源:https://leetcode.cn/problems/wiggle-subsequence/description/

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

 力扣 376. 摆动序列_第2张图片

 C++题解1:使用flg标记第一个是增还是减,如果是平,则直接返回1;根据标记的flg,不断更新顶峰值和谷底值,直到最高或者最低。

class Solution {
public:
    int wiggleMaxLength(vector& nums) {
        int res = 1;
        bool flg = true;
        int len = nums.size();
        if(len == 1) return 1;
        int pre = nums[0];
        int i = 1;
        for(; i < len; i++) {     // 寻找开局是上还是下
            if(nums[i] - pre > 0){
                pre = nums[i];
                flg = true;
                break;
            }
            else if(nums[i] - pre < 0) {
                pre = nums[i];
                flg = false;
                break;
            }
        }
        if(i == len) return 1;  // 如果一路是平,则返回1
        else res++;
        for(int j = i + 1; j < len; j++) {   // 符合摆动则+1,更新flg;不符合摆动,则更新峰值或者低值或者平值
            if(flg && nums[j] < pre) {
                res++;
                flg = false;
                pre = nums[j];
            }
            else if(!flg && nums[j] > pre) {
                res++;
                flg = true;
                pre = nums[j];
            }
            else { 
                pre = nums[j];  // 更新峰值或者低值或者平值
            }
        }
        return res;
    }
};

C++题解2(来源代码随想录)

class Solution {
public:
    int wiggleMaxLength(vector& nums) {
        if (nums.size() <= 1) return nums.size();
        int curDiff = 0; // 当前一对差值
        int preDiff = 0; // 前一对差值
        int result = 1;  // 记录峰值个数,序列默认序列最右边有一个峰值
        for (int i = 0; i < nums.size() - 1; i++) {
            curDiff = nums[i + 1] - nums[i];
            // 出现峰值
            if ((preDiff <= 0 && curDiff > 0) || (preDiff >= 0 && curDiff < 0)) {
                result++;
            }
            preDiff = curDiff;
        }
        return result;
    }
};

你可能感兴趣的:(开始C++吧,leetcode,算法,c++,贪心算法)