当前位置: 首页 > news >正文

LeetCode 280:摆动排序 | 原地调整算法

LeetCode 280:摆动排序 | 原地调整算法

引言

摆动排序(Wiggle Sort)是 LeetCode 第 280 题,难度为 Medium。题目要求原地调整数组,使数组满足 nums[0] <= nums[1] >= nums[2] <= nums[3] ...。

与摆动排序 II 不同,I 允许相邻元素相等。这使得问题更简单:只需要在遍历过程中,确保每个偶数位(0, 2, 4...)的元素小于等于下一个元素。

问题分析

题目描述

给定数组 nums,重新排列数组使满足 nums[0] <= nums[1] >= nums[2] <= nums[3] ...

问题特点

由于允许相等,问题的约束更宽松。可以使用简单的遍历,在遇到不符合条件的元素时,交换相邻元素即可。

解决方案

贪心方法

def wiggleSort(nums): for i in range(len(nums) - 1): if (i % 2 == 0 and nums[i] > nums[i + 1]) or \ (i % 2 == 1 and nums[i] < nums[i + 1]): nums[i], nums[i + 1] = nums[i + 1], nums[i]

算法详解

遍历数组,对于每个位置 i:

  • 如果 i 是偶数,要求 nums[i] <= nums[i+1]。如果不满足,交换两者。
  • 如果 i 是奇数,要求 nums[i] >= nums[i+1]。如果不满足,交换两者。

复杂度分析

时间复杂度

时间复杂度为 O(n),因为只需要一次遍历。

空间复杂度

空间复杂度为 O(1),原地操作。

代码实现

Python 实现

def wiggleSort(nums): for i in range(len(nums) - 1): if i % 2 == 0: if nums[i] > nums[i + 1]: nums[i], nums[i + 1] = nums[i + 1], nums[i] else: if nums[i] < nums[i + 1]: nums[i], nums[i + 1] = nums[i + 1], nums[i]

测试用例

def test_wiggle_sort(): nums1 = [3, 5, 2, 1, 6, 4] wiggleSort(nums1) for i in range(len(nums1) - 1): if i % 2 == 0: assert nums1[i] <= nums1[i + 1] else: assert nums1[i] >= nums1[i + 1] print("所有测试用例通过!")

总结

摆动排序 I 比 II 更简单,因为允许相邻元素相等。只需要一次遍历,确保每个偶数位小于等于下一个元素,每个奇数位大于等于下一个元素。

http://www.jsqmd.com/news/881132/

相关文章:

  • 2026金融场景工业平板评测与产品推荐:工业计算机厂家、全国产化主板、国产化电脑定制、工业平板电脑、工业平板、嵌入式工控机选择指南 - 优质品牌商家
  • Hindsight与金融AI集成:交易决策记忆和分析的终极指南
  • 2026年比较好的装修施工用户好评公司 - 行业平台推荐
  • QuickLyric终极指南:如何在Android上免费获取自动同步歌词
  • Qwen-Agent:企业级AI智能体框架的架构深度解析与实战指南
  • (案例)软考系统分析师「移动应用系统」核心知识梳理
  • ARM SME指令集:矩阵运算加速与AI应用实践
  • 实战精通openpilot自动驾驶系统:从安装到深度定制的完整指南
  • 2026年靠谱的杭州工装装修施工榜单优选公司 - 品牌宣传支持者
  • Magic VLSI:开启你的芯片设计之旅,从零到一轻松掌握
  • 北京游学机构哪家好?高性价比的青少年独立北京研学机构推荐 - 品牌2025
  • B3642 二叉树的遍历<---搜索与树
  • Windows 10/11 卸载 TeamViewer 后,为什么它还在后台运行?教你彻底清理注册表和残留文件
  • 基于ArUco标记的毫米波反射镜自主对准系统设计与实现
  • 别再踩坑了!Ubuntu 22.04 上编译 Mbedtls 3.6 的完整避坑指南(附 Python 依赖解决)
  • 2026年4月宁波好用的废气治理加工厂推荐分析,水帘除尘器/湿式除尘器/旋风分离器/油雾分离器,废气治理厂商推荐 - 品牌推荐师
  • 5分钟上手!Linux用户必备的Apple Emoji字体安装教程
  • 北京研学机构哪家好?住宿条件好的青少年北京研学机构推荐 - 品牌2025
  • NexoPOS用户指南:从小白到专家的10个实用技巧
  • C++11包装器适配器详解
  • 从零到一开发快递追踪功能:Espresso核心模块代码实现终极指南 [特殊字符]
  • MobX响应式原理深度剖析:理解MobX如何追踪依赖和触发更新
  • 小白也能懂的经典蓝牙 BLE 专栏
  • 2026优质木箱厂家推荐:出口木箱、卡板厂家、木托盘、木箱厂家、胶合板木箱、免熏蒸卡板、免熏蒸木箱、出口卡板、胶合板卡板选择指南 - 优质品牌商家
  • 随机数值线性代数在格点QCD中的高效应用
  • 高级技能-安全-网络安全:WAF、IDS/IPS、DDoS 防护
  • 为什么Pandoc能成为文档转换领域的瑞士军刀?
  • 03 蓝牙全家福——一张图看懂蓝牙协议栈
  • 如何通过Pushd API实现用户订阅管理?完整指南
  • 双向可控硅交流控制电路基础知识及Multisim电路仿真