LeetCode 376 摆动序列 - 贪心解法

LeetCode 376 摆动序列 - 贪心解法

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

思路

  • 直觉上可以看某个点是不是 V^,但这种写法很难处理“平坡”。
  • 实际上,是否计数取决于 方向是否发生变化
  • 如果前后都是上升(中间即使有平坡),就没有新拐点;如果从上升变为下降(或反过来),就产生一个拐点。

因此,只需要关注“非平坡方向”的变化。统计的是 有效上升/下降区间数量,最后答案是“区间数 + 1”。

代码

这里 pre_direction 只有初始为 0,后续一旦遇到非平坡差值就会更新为正或负。


class Solution {

public:

    int wiggleMaxLength(vector<int>& nums) {

        if(nums.size()<=1) return nums.size();

        int res = 0;

        int pre_direction =0;

        for(int i = 1;i<nums.size();i++){

            int direction = nums[i] -nums[i-1];

            if(direction!=0){

                if(direction>0&&pre_direction<=0) res++;

                if(direction<0&&pre_direction>=0) res++;

                pre_direction = direction;

            }

        }

        return res+1;

    }

};