leetcode376.摆动序列(中等)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
思路:flag的正负来表示上一次的状态,当“峰”遇到下降时ans++,当“谷”遇到上升时ans++。

class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) {
       
        int n = nums.size();
        if (n < 2) return n;
        int flag = nums[1] - nums[0],  ans = (nums[1] - nums[0]) ? 2 : 1; 
        for (int i = 1; i < n; ++i) {
            int diff = nums[i] - nums[i - 1];
            if((diff > 0 && flag <= 0) || (diff < 0 && flag >= 0)) { //
                flag = diff;
                ans++;
            }
        }
        return ans;
    }
};

注意(简化代码)
1:ans的初始值:如果 nums[1] - nums[0]为0时,ans为1,否则不管是“峰”还是“谷”,ans都是2
2:flag标志的问题:为什么不用-1和1来区别?因为可能有平的一段(用0来表示),比如一开始的时候,需要将0和(1 -1)分开讨论,所以会更麻烦一点,用正负的话。在判断是否出现“峰”或者“谷”的时候判断条件加上 “=”就不用把“平”单独考虑了。

思路二:相邻的去重,直接判断“峰”和“谷”
思路类似:leetcode122.买股票的最佳时机II(中等)
https://blog.csdn.net/zhangjiaji111/article/details/123921873

class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) {
        vector<int> v;
        int n = nums.size(), ans = 0;
        for (int i = 0; i < n; ++i) {
            if (i > 0 && nums[i] == nums[i - 1]) continue;
            v.push_back(nums[i]);
        }
        n = v.size();
        if (n == 1) return 1;
        for (int i = 1; i < n - 1; ++i) {
            if (v[i] > v[i - 1] && v[i] > v[i + 1]) ans++;
            if (v[i] < v[i - 1] && v[i] < v[i + 1]) ans++;
        }
        return ans + 2;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值