贪心算法-摆动序列

「摆动序列」(LeetCode 376)知识点总结


一、题目核心定义与要求

  • 摆动序列 :如果连续数字之间的差值严格地在正数和负数之间交替 ,则该序列为摆动序列。
    • 特例:仅包含1个元素 ,或包含2个不相等元素的序列,也视为摆动序列。
    • 反例:差值连续为正(如 [1,4,7,2,5])、差值为0(如 [1,7,4,5,5])的序列,都不是摆动序列。
  • 子序列:可通过删除原序列中部分元素(或不删除)得到,且保持元素原有顺序。
  • 目标 :给定整数数组 nums,返回其中最长摆动子序列的长度

二、核心算法:贪心解法

1. 贪心思路
  • 核心逻辑:最长摆动子序列的长度,等价于序列中波峰 + 波谷的数量 + 1(首尾元素默认算入)。
  • 操作方式:遍历数组,统计相邻元素差值的正负变化次数,每次变化即对应一个波峰或波谷。
2. 关键细节
  • 若相邻元素差值为 0(即连续相等),不产生波峰/波谷,直接跳过。
  • 只需记录前一个差值的符号 ,与当前差值的符号对比:
    • 若符号相反(正→负 或 负→正),则说明出现了波峰/波谷,计数加1。
  • 初始时,若数组长度为 01,直接返回数组长度;若长度为 2,返回 2(只要两元素不等)。

三、示例解析

  • 示例 1 :输入 [1,7,4,9,2,5]
    差值序列为 6, -3, 5, -7, 3,正负交替出现,因此整个序列是摆动序列,长度为 6
  • 示例 2 :输入 [1,17,5,10,13,15,10,5,16,8]
    差值序列为 16, -12, 5, 3, 2, -5, -5, 11, -8,其中正负交替的有效变化有6次,因此最长摆动子序列长度为 7

四、其他解法:动态规划

  • 维护两个状态数组:
    • up[i]:以 nums[i] 结尾的最长上升摆动子序列长度(最后一个差值为正)。
    • down[i]:以 nums[i] 结尾的最长下降摆动子序列长度(最后一个差值为负)。
  • 状态转移:
    • nums[i] > nums[i-1],则 up[i] = down[i-1] + 1down[i] = down[i-1]
    • nums[i] < nums[i-1],则 down[i] = up[i-1] + 1up[i] = up[i-1]
    • 若相等,up[i] = up[i-1]down[i] = down[i-1]
  • 最终结果为 max(up[n-1], down[n-1])
相关推荐
AndrewHZ2 小时前
【AI黑话日日新】什么是隐式CoT?
人工智能·深度学习·算法·llm·cot·复杂推理
芒克芒克2 小时前
LeetCode 跳跃游戏 II 最优解法:贪心算法
leetcode·游戏·贪心算法
格林威2 小时前
Baumer相机视野内微小缺陷增强检测:提升亚像素级瑕疵可见性的 7 个核心方法,附 OpenCV+Halcon 实战代码!
人工智能·数码相机·opencv·算法·计算机视觉·视觉检测·工业相机
进击的荆棘3 小时前
优选算法——滑动窗口
c++·算法·leetcode
csdn_aspnet3 小时前
奈飞工厂算法:个性化推荐系统的极限复刻
算法·netflix·奈飞
小白_ysf3 小时前
Vue 中常见的加密方法(对称、非对称、杂凑算法)
前端·vue.js·算法
多米Domi0114 小时前
0x3f 第49天 面向实习的八股背诵第六天 过了一遍JVM的知识点,看了相关视频讲解JVM内存,垃圾清理,买了plus,稍微看了点确定一下方向
jvm·数据结构·python·算法·leetcode
A_nanda13 小时前
c# MOdbus rto读写串口,如何不相互影响
算法·c#·多线程
代码雕刻家14 小时前
2.4.蓝桥杯-分巧克力
算法·蓝桥杯