376. 摆动序列

贪心

解题思路

  1. 刷了好几道贪心的题,还是对贪心比较模糊,这道题我是真想不到,为什么要用贪心,坚持写题解;

  2. 局部最优:删除单调坡度上的节点(不包括单调坡度两端的节点),那么这个坡度就可以有两个局部峰值;

  3. 整体最优:整个序列有最多的局部峰值,从而达到最长摆动序列;

  4. 实际操作上,其实连删除的操作都不用做,因为题目要求的是最长摆动子序列的长度,所以只需要统计数组的峰值数量就可以了(相当于是删除单一坡度上的节点,然后统计长度),这就是贪心所贪的地方,让峰值尽可能的保持峰值,然后删除单一坡度上的节点;

  5. 本题的一个大体思路,要考虑两种情况:

    • 情况一:相同数字连续;
    • 情况二:单调坡度有平坡;

复杂度

  1. 时间复杂度:O(n),其中 n 是序列的长度;

  2. 空间复杂度:O(1)

代码实现

var wiggleMaxLength = function (nums) {
    const n = nums.length;
    if (n < 2) return n;

    let prevdiff = nums[1] - nums[0]; // 记录之前的坡度(当前是初始坡度)
    let res = prevdiff !== 0 ? 2 : 1; // 判断前两个节点是否全部满足摆动序列

    // 在 [第二个元素,最后一个元素] 这个区间计算摆动
    for (let i = 2; i < n; i++) {
        // 当前坡度
        const currdiff = nums[i] - nums[i - 1];
        // 出现峰值
        if ((currdiff > 0 && prevdiff <= 0) || (currdiff < 0 && prevdiff >= 0)) {
            res++;
            prevdiff = currdiff; // 更新峰值
        }
    }

    return res;
};

动态规划

解题思路

先欠着😢

复杂度

代码实现


打赏作者
您的打赏是我前进的动力
微信
支付宝
评论

中午好👏🏻,我是 ✍🏻   疯狂 codding 中...

粽子

这有关于前端开发的技术文档和你分享。

相信你可以在这里找到对你有用的知识和教程。

了解更多

目录

  1. 1. 贪心
    1. 1.1. 解题思路
    2. 1.2. 复杂度
    3. 1.3. 代码实现
  2. 2. 动态规划
    1. 2.1. 解题思路
    2. 2.2. 复杂度
    3. 2.3. 代码实现