摆动序列

摆动序列

一、问题描述

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 = nums[1] - nums[0],若差值不为 0,说明前两个元素构成了摆动序列的初始趋势,此时摆动序列长度初始化为 2;若差值为 0,意味着前两个元素相等,不构成摆动趋势,摆动序列长度初始化为 1。

  2. 遍历数组寻找变化趋势:记录当前变化趋势curTrend = nums[i] - nums[i - 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),只需要常数级的额外空间。
相关推荐
mit6.8244 分钟前
山脉二分找中值|子集型回溯
算法
乃瞻衡宇13 分钟前
Agent Skills 完全指南:让你的 AI Agent 拥有超能力
算法
mit6.82416 分钟前
pair<int, TreeNode*> dfs
算法
初晴や1 小时前
【C++】图论:基础理论与实际应用深入解析
c++·算法·图论
李泽辉_1 小时前
深度学习算法学习(五):手动实现梯度计算、反向传播、优化器Adam
深度学习·学习·算法
李泽辉_1 小时前
深度学习算法学习(一):梯度下降法和最简单的深度学习核心原理代码
深度学习·学习·算法
꧁Q༒ོγ꧂2 小时前
算法详解---大纲
算法
m0_603888712 小时前
Scaling Trends for Multi-Hop Contextual Reasoning in Mid-Scale Language Models
人工智能·算法·ai·语言模型·论文速览
Xの哲學2 小时前
Linux io_uring 深度剖析: 重新定义高性能I/O的架构革命
linux·服务器·网络·算法·边缘计算
comli_cn2 小时前
残差链接(Residual Connection)
人工智能·算法