摆动序列

摆动序列

一、问题描述

LeetCode376. 摆动序列

如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。

例如,[1, 7, 4, 9, 2, 5] 是一个摆动序列,因为差值 (6, -3, 5, -7, 3) 是正负交替出现的。

相反,[1, 4, 7, 2, 5][1, 7, 4, 5, 5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。

给定一个整数数组 nums,返回 nums 中作为摆动序列的最长子序列的长度。

二、解题思路

摆动序列的关键在于寻找数组中的峰和谷。每当序列发生方向变化时,摆动序列的长度就会增加。因此,可以通过遍历数组,统计方向变化的次数来得到最长摆动序列的长度。

  1. 记录初始趋势:计算数组前两个元素的差值作为最开始的变化趋势preTrend = nums1 - nums0,若差值不为 0,说明前两个元素构成了摆动序列的初始趋势,此时摆动序列长度初始化为 2;若差值为 0,意味着前两个元素相等,不构成摆动趋势,摆动序列长度初始化为 1。

  2. 遍历数组寻找变化趋势:记录当前变化趋势curTrend = numsi - numsi - 1,若当前变化趋势curTrend 与之前的变化趋势preTrend 不同,preTrend <= 0 && curTrend > 0 或者 preTrend >= 0 && curTrend < 0 时 更新变化趋势preTrend ,摆动序列加1

三、代码实现

以下是使用 JavaScript 实现的代码:

javascript 复制代码
var wiggleMaxLength = function (nums) {
  //  统计波峰波谷的数量
  // 若长度为1 或为 0
  if (nums.length < 2) return nums.length;
    
  let preTrend = nums[1] - nums[0]; 
  let reLen = preTrend !== 0 ? 2 : 1;
    
  for (let i = 2; i < nums.length; i++) {
    let curTrend = nums[i] - nums[i - 1];
    //  当出现波谷或者波峰时,更新preTrend
    if ((preTrend <= 0 && curTrend > 0) || (preTrend >= 0 && curTrend < 0)) {
      preTrend = curTrend;
      reLen++;
    }
  }
  return reLen;
};

四、注意事项

  1. 边界条件需谨慎:在处理数组前两个元素确定初始趋势时,要特别注意数组长度为 2 的情况。若两个元素相等,初始化摆动序列长度为 1,此时不能因为后续没有更多元素判断趋势变化,就错误认为长度还能增加。在遍历过程中,若遇到数组结尾,也应保证最后一次趋势变化能正确统计,避免遗漏。
  2. 趋势判断避免误判 :在比较差值判断趋势变化时,条件 (preTrend <= 0 && curTrend > 0) 与 (preTrend >= 0 && curTrend < 0) 中的 "小于等于" 和 "大于等于" 不能随意替换为 "小于" 和 "大于"。例如,当出现连续相等元素后趋势改变的情况,若使用严格的 "小于" 和 "大于" 判断,可能会错过第一个有效趋势变化点,导致结果错误。

五、复杂度分析

  1. 时间复杂度O (n ),其中 n 是数组的长度。只需要遍历一次数组。
  2. 空间复杂度O(1),只需要常数级的额外空间。
相关推荐
装不满的克莱因瓶35 分钟前
掌握生成对抗网络(GAN)的优化目标与评估指标——从博弈函数到生成质量衡量体系
人工智能·python·深度学习·算法·机器学习
技术小黑38 分钟前
CNN算法实战系列06 | InceptionV1实现猴痘病识别
深度学习·算法·cnn·inceptionv1
云淡风轻~窗明几净1 小时前
角谷猜想的任意算法测试
数据结构·人工智能·算法
happygrilclh1 小时前
赚外快了:等离子表面处理机电源算法需求说明
算法
ji198594431 小时前
MATLAB 求散点曲线斜率
开发语言·算法·matlab
kaikaile19951 小时前
MATLAB 实现:Koch & Zhao 图像水印算法(DCT域)
开发语言·算法·matlab
QiLinkOS1 小时前
QiLink开源生态的三维重构:基于时间、空间与社会价值的底层规则创新白皮书
大数据·c++·人工智能·科技·算法·gitee·开源
牛肉在哪里2 小时前
ros2 从零开始28 监听广播C++
开发语言·c++·算法·机器人
乐观勇敢坚强的老彭2 小时前
GESP一级核心算法:循环与条件判断的结合
java·数据结构·算法
noipp2 小时前
推荐题目:洛谷 P1737 [NOI2016] 旷野大计算
linux·数据结构·算法