news 2026/6/15 11:06:49

摆动序列(贪心算法)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
摆动序列(贪心算法)

一、题目解析

1. 题目描述

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

给定整数数组nums,返回其中作为摆动序列的最长子序列长度(子序列可删除部分元素,剩余元素保持原顺序)。

2. 核心特征

  • 摆动核心:相邻差值必须严格正负交替(不能为 0);
  • 子序列特性:无需连续,只需保持元素原始顺序;
  • 边界情况:
    • 数组长度 ≤ 1 → 直接返回长度;
    • 数组长度 = 2 → 两元素相等返回 1,不等返回 2。

3. 贪心算法核心思路

纯贪心的核心逻辑是:统计数组中 “有效摆动点” 的数量,最长摆动序列长度 = 摆动点数量 + 1

4. 核心定义

  • 摆动点:当前元素与前一个元素的差值符号,和前一个差值的符号相反且非 0,则当前元素是一个摆动点;
  • 初始状态:数组第一个元素默认是 “起点”,计数为 1;
  • 遍历过程:只关注 “差值符号变化”,忽略连续相同符号的差值(包括差值为 0),因为这些元素对最长摆动序列无贡献。

5. 贪心策略本质

我们的目标是找到最长的摆动子序列,因此只需要保留每次差值符号变化的元素,跳过连续同方向 / 相同的元素 —— 这就是贪心的 “最优选择”:每一步都选能形成摆动的元素,最终得到全局最长序列。

二、贪心算法完整实现

class Solution { public int wiggleMaxLength(int[] nums) { // 边界情况1:空数组或单元素数组,直接返回长度 if (nums == null || nums.length <= 1) { return nums.length; } // 边界情况2:两个元素的特殊处理(提前判断避免后续逻辑冗余) if (nums.length == 2) { return nums[0] == nums[1] ? 1 : 2; } int maxLen = 1; // 初始长度:第一个元素 int prevDiff = 0; // 记录前一个有效差值(初始为0,表示还未确定方向) // 从第二个元素开始遍历 for (int i = 1; i < nums.length; i++) { // 计算当前元素与前一个元素的差值 int currDiff = nums[i] - nums[i - 1]; // 核心贪心判断: // 1. 当前差值非0(排除连续相同元素) // 2. 当前差值符号与前一个有效差值符号相反 if ((currDiff > 0 && prevDiff <= 0) || (currDiff < 0 && prevDiff >= 0)) { maxLen++; // 找到摆动点,长度+1 prevDiff = currDiff; // 更新前一个有效差值为当前差值 } // 差值为0 或 符号与前一个相同 → 跳过,不更新 } return maxLen; } }

三、关键代码解析

1. 边界处理

if (nums == null || nums.length <= 1) { return nums.length; } if (nums.length == 2) { return nums[0] == nums[1] ? 1 : 2; }
  • 空数组 / 单元素数组:直接返回长度(本身就是摆动序列);
  • 双元素数组:相等返回 1,不等返回 2(符合题目 “两个不等元素视作摆动序列” 的定义)。

2. 核心贪心逻辑

java

运行

if ((currDiff > 0 && prevDiff <= 0) || (currDiff < 0 && prevDiff >= 0)) { maxLen++; prevDiff = currDiff; }
  • currDiff > 0 && prevDiff <= 0:当前上升,且前一个差值是下降 / 初始状态(0)→ 形成摆动;
  • currDiff < 0 && prevDiff >= 0:当前下降,且前一个差值是上升 / 初始状态(0)→ 形成摆动;
  • 只有满足上述条件,才计数 + 1,并更新prevDiff为当前有效差值(避免后续重复计数)。

3. 变量说明

表格

变量作用
maxLen记录最长摆动序列长度,初始为 1(第一个元素)
prevDiff记录上一个 “有效摆动” 的差值(非 0),初始为 0
currDiff当前元素与前一个元素的差值

四、执行过程演示(示例 2)

输入:nums = [1,17,5,10,13,15,10,5,16,8]

表格

索引 inums[i]currDiffprevDiffmaxLen说明
01-01初始状态
11716(+)02上升 + 初始状态 → 摆动点,len+1,prevDiff=16
25-12(-)16(+)3下降 + 上升 → 摆动点,len+1,prevDiff=-12
3105(+)-12(-)4上升 + 下降 → 摆动点,len+1,prevDiff=5
4133(+)5(+)4同方向 → 跳过
5152(+)5(+)4同方向 → 跳过
610-5(-)5(+)5下降 + 上升 → 摆动点,len+1,prevDiff=-5
75-5(-)-5(-)5同方向 → 跳过
81611(+)-5(-)6上升 + 下降 → 摆动点,len+1,prevDiff=11
98-8(-)11(+)7下降 + 上升 → 摆动点,len+1,prevDiff=-8

最终结果:7,与示例 2 一致。

五、关键测试用例验证

测试用例 1:nums = [1,7,4,9,2,5]

执行过程:

  • 差值依次为 6 (+)、-3 (-)、5 (+)、-7 (-)、3 (+);
  • 每次差值符号都相反,共 5 个摆动点,maxLen = 1+5 = 6(正确)。

测试用例 2:nums = [1,2,3,4,5,6,7,8,9]

执行过程:

  • 差值全为正,仅第一次上升触发计数(len=2),后续同方向跳过;
  • 最终maxLen = 2(正确)。

测试用例 3:nums = [0,0,0]

执行过程:

  • 所有差值为 0,无摆动点,maxLen = 1(正确)。

六、复杂度分析

表格

维度复杂度说明
时间复杂度O(n)仅遍历数组一次,n 为数组长度
空间复杂度O(1)仅使用maxLenprevDiffcurrDiff三个常量变量,无额外空间

七、总结

  1. 纯贪心算法解决摆动序列问题的核心是统计有效摆动点:只保留差值符号变化的元素,跳过同方向 / 相同元素;
  2. 关键判断条件:当前差值非 0,且与前一个有效差值符号相反;
  3. 时间复杂度 O (n)、空间复杂度 O (1),是最优解法之一;
  4. 边界处理需注意:空数组、单元素、双元素、全相同元素的场景。

当然这道题也可以用贪心算法加上动规来做,有兴趣的可以去试一试

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 12:19:20

windows QT项目

一、1、2、在纯linux环境下用QTCreator这个IDE去编项目&#xff1b;但是如果在windows上编写qt项目&#xff0c;VS这个IDE还是比QTCreator要强大很多&#xff0c;而且VS编写的QT项目&#xff0c;仍然可以移植到Linux等平台上&#xff0c;不影响跨平台特性&#xff01;&#xff…

作者头像 李华
网站建设 2026/6/15 6:52:36

‌新闻事件分析:社交媒体数据验证测试案例

为什么社交媒体数据正在重塑测试边界‌在2026年&#xff0c;软件测试的战场已不再局限于API响应码、数据库事务一致性或UI布局像素偏差。‌社交媒体数据‌&#xff0c;作为全球最庞大、最动态、最不可控的非结构化输入源&#xff0c;正成为系统鲁棒性验证的“终极压力测试场”。…

作者头像 李华
网站建设 2026/6/15 12:11:23

vue2基础--实现下拉框选择筛选

下拉框筛选常用于搜索筛选出列表中的数据1.代码<el-selectv-model"type"clearableplaceholder"类型" ><el-optionv-for"item in typeOptions":key"item.value":label"item.label":value"item.value&quo…

作者头像 李华
网站建设 2026/6/15 12:15:12

2026年生物计算开发者伦理自查清单

第一章 生物计算测试的特殊性认知 1.1 生命数据敏感性分级 风险维度 测试关注要点 检测工具示例 基因数据 脱敏后仍可逆向识别风险 HelixSec渗透测试套件 神经接口信号 脑波模式唯一性验证 NeuroGuard仿真平台 生物特征标识 3D打印攻击向量测试 BioReplica漏洞扫描…

作者头像 李华
网站建设 2026/6/15 14:36:07

情感驱动:星际团队如何建立“光年信任”?

信任的星际挑战与情感驱动新范式 在软件测试领域&#xff0c;分布式团队&#xff08;常被喻为“星际团队”&#xff09;已成为常态&#xff0c;成员跨越时区协作&#xff0c;却常陷入“本地可复现-线上必失败”的信任危机。这种“光年信任”缺失不仅导致缺陷漏测、项目延误&am…

作者头像 李华
网站建设 2026/6/15 12:24:37

首个大规模记忆湖发布,AI Infra跑步进入“记忆”时代

LLM就如同AI的“第一大脑&#xff08;生物脑&#xff09;”&#xff0c;它擅长思考、推理与即时生成&#xff0c;而不擅长长期、精确地存储海量事实。“Your brain is for having ideas, not holding them. ”——Tiago Forte《Building a Second Brain》LLM是AI的“第一大脑”…

作者头像 李华