在这里插入图片描述
在这里插入图片描述

文章目录

    • 摘要
    • 描述
    • 题解答案
    • 题解代码(Swift)
    • 题解代码分析
      • 步骤一:排序数组
      • 步骤二:左右指针分段
      • 步骤三:按位置交错插入
    • 示例测试及结果
      • 示例 1
      • 示例 2
      • 示例 3(边界情况)
    • 时间复杂度分析
    • 空间复杂度分析
    • 总结

摘要

摆动排序听起来像在跳舞,实际上它确实是让数组的数字“上下起伏”。我们要把一个整数数组重新排列,满足 nums[0] < nums[1] > nums[2] < nums[3]... 这种交错顺序。这篇文章会用 Swift 带你从头撸清楚摆动排序背后的技巧,包括排序、分组、巧妙插入的实战过程。

描述

题目要求我们把一个数组 nums 改造成如下的交错结构:

nums[0] < nums[1] > nums[2] < nums[3] ...

这个结构的关键点是:

  • 奇数下标元素大于相邻的偶数下标元素。
  • 偶数下标元素小于相邻的奇数下标元素。

可以认为是局部波峰波谷结构:小、大、小、大……

你不需要返回新的数组,而是直接修改原数组即可。

题解答案

我们可以先对数组排序,然后将较小的数填在偶数位,较大的数填在奇数位。

这个策略保证了交错关系。重点是我们要“倒着”填充数组,避免相邻重复值打破摆动规则。

题解代码(Swift)

func wiggleSort(_ nums: inout [Int]) {let sorted = nums.sorted()let n = nums.countvar left = (n - 1) / 2var right = n - 1for i in 0..<n {if i % 2 == 0 {nums[i] = sorted[left]left -= 1} else {nums[i] = sorted[right]right -= 1}}
}

题解代码分析

步骤一:排序数组

let sorted = nums.sorted()

我们先排序一遍数组,这样方便从中间拆成两个部分。

步骤二:左右指针分段

var left = (n - 1) / 2  // 前半部分的最大索引(用于偶数位)
var right = n - 1       // 后半部分的最大索引(用于奇数位)

这个拆法保证了我们从中间往前、往后取值,不会让重复数字挤在一起。

步骤三:按位置交错插入

for i in 0..<n {if i % 2 == 0 {nums[i] = sorted[left]left -= 1} else {nums[i] = sorted[right]right -= 1}
}
  • 偶数位:从左半部分最大往前取(最小值)
  • 奇数位:从右半部分最大往前取(最大值)

最终形成“小大小大”这样的节奏排序。

示例测试及结果

示例 1

var nums1 = [1, 5, 1, 1, 6, 4]
wiggleSort(&nums1)
print(nums1)  // 输出如:[1,6,1,5,1,4] 或类似交错结构

示例 2

var nums2 = [1, 3, 2, 2, 3, 1]
wiggleSort(&nums2)
print(nums2)  // 输出如:[2,3,1,3,1,2]

示例 3(边界情况)

var nums3 = [1]
wiggleSort(&nums3)
print(nums3)  // 输出:[1]

时间复杂度分析

  • 排序:O(n log n)
  • 重排:O(n)
  • 总时间复杂度:O(n log n)

空间复杂度分析

  • 我们使用了一个额外的排序数组 sorted,空间为 O(n)
  • 总空间复杂度:O(n)(如果原地排序并三指针替换,可降到 O(1))

总结

“摆动排序”这题不只是让数字跳个舞,更是考验我们如何拆分数组、如何巧妙插入。

你需要掌握的几个重点:

  • 排序 + 分段思维
  • 左右指针从两端交替插入
  • 巧妙处理重复值,避免打破排序节奏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/88976.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/88976.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/88976.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用SQLMAP的文章管理系统CMS的sql注入渗透测试

SQLMAP注入演示&#xff1a;抓包拿到Cookie:召唤sqlmap&#xff1a;sqlmap -u "http://192.168.1.99:8085/show.php?id34" --cookie "pma_langzh_CN; kbqug_admin_username2621-PL_LxhFjyVe43ZuQvht6MI5q0ZcpRVV5FI0pzQ6XR8; kbqug_siteid2621-PL_LxhFjyVe4yA5…

I3C通信协议核心详解

一、物理层与电气特性双线结构 SCL&#xff08;串行时钟线&#xff09;&#xff1a;主设备控制&#xff0c;支持 推挽&#xff08;Push-Pull&#xff09;输出&#xff08;高速模式&#xff09;和 开漏&#xff08;Open-Drain&#xff09;&#xff08;兼容I2C模式&#xff09;。…

Docker搭建Redis哨兵集群

Redis提供了哨兵机制实现主从集群下的故障转移&#xff0c;其中包含了对主从服务的检测、自动故障恢复和通知。 1.环境 centos7、redis6.2.4、MobaXterm 目的&#xff1a; 搭建redis的主从同步哨兵集群&#xff08;一主一从三哨兵&#xff09; 2.步骤 1.主从集群的搭建 主从…

暑假Python基础整理 --异常处理及程序调试

异常概念 在程序运行过程中&#xff0c;经常会遇到各种各样的错误&#xff0c;这些错误统称为“异常”。如下表是Python常见的异常与描述&#xff1a; 异常描述NameError尝试访问一个未声明的变量引发错误IndexError索引超出序列范围引发错误IndentationError缩进错误ValueErr…

k8s-高级调度(二)

目录 Taint(污点)与Toleration(容忍) Taint&#xff08;污点&#xff09;&#xff1a;节点的排斥标记 Toleration&#xff08;容忍&#xff09;&#xff1a;Pod的适配声明 与节点亲和性的对比 警戒(cordon)和转移(drain) Cordon&#xff1a;节点隔离&#xff08;阻止新 Po…

基于OpenCV的深度学习人脸识别系统开发全攻略(DNN+FaceNet核心技术选型)

核心技术选型表 技术组件版本/型号用途OpenCV DNN4.5.5人脸检测FaceNet (facenet-pytorch)0.5.0人脸特征提取MiniConda最新版Python环境管理PyTorch1.8.0FaceNet运行基础OpenVINO2021.4模型加速(可选)SSD Caffe模型res10_300x300高精度人脸检测 一、环境准备与项目搭建 1.1 M…

【AI News | 20250714】每日AI进展

AI Repos 1、All-Model-Chat All Model Chat 是一款为Google Gemini API家族设计的网页聊天应用&#xff0c;支持多模态输入&#xff08;图片、音频、PDF等&#xff09;和多种模型&#xff08;如Gemini Flash、Imagen&#xff09;。它提供了丰富的自定义功能&#xff0c;包括高…

C 语言(二)

主要包括变量与常量、数据类型、存储方式、数制转换以及字符处理等内容一、变量与常量在 C 语言中&#xff0c;变量是用来存储数据的命名空间&#xff0c;它会在内存中分配地址。例如&#xff1a;int i; i 12345; 其中 i 是变量&#xff0c;12345 是常量。常量表示在程序运行过…

原型继承(prototypal inheritance)的工作原理

这是一个非常常见的 JavaScript 问题。所有 JS 对象都有一个__proto__属性&#xff0c;指向它的原型对象。当试图访问一个对象的属性时&#xff0c;如果没有在该对象上找到&#xff0c;它还会搜寻该对象的原型&#xff0c;以及该对象的原型的原型&#xff0c;依次层层向上搜索&…

OpenCV 视频处理与摄像头操作详解

1. 引言大家都来写OpenCV&#x1f60a;&#xff0c;学的好开心&#xff01;2. 视频基础与OpenCV简介2.1 视频的定义视频&#xff08;Video&#xff09;是由一系列静态图像&#xff08;帧&#xff09;以一定速率连续播放形成的动态影像。其本质是利用人眼的视觉暂留效应&#xf…

Agentic AI 的威胁与缓解措施

原文&#xff1a;https://www.aigl.blog/content/files/2025/04/Agentic-AI—Threats-and-Mitigations.pdf AI Agent 的定义 1. 定义与基础 智能代理&#xff08;Agent&#xff09;的定义&#xff1a; 智能代理是一种能够感知环境、进行推理、做出决策并自主采取行动以实现特定…

ArrayList列表解析

ArrayList集合 ArrayList 的底层是数组队列&#xff0c;相当于动态数组。与 Java 中的数组相比&#xff0c;它的容量能动态增长。在添加大量元素前&#xff0c;应用程序可以使用ensureCapacity操作来增加 ArrayList 实例的容量。这可以减少递增式再分配的数量。 ArrayList 继承…

《恋与深空》中龙和蛇分别是谁的代表

在《恋与深空》宏大而神秘的世界观中&#xff0c;每一个符号都蕴含着深意。当玩家们热议“龙”和“蛇”这两种强大而古老的生物究竟代表着谁时&#xff0c;所有的线索都默契地指向了同一个名字——秦彻。 他不仅是力量与权威的象征“恶龙”&#xff0c;也是背负着宿命与纠葛的“…

gitignore添加后如何生效?

清除 Git 缓存&#xff1a; git rm -r --cached .添加文件到 Git&#xff1a;git add .使用 git commit 命令提交这些更改git commit -m "Update .gitignore"

多尺度频率辅助类 Mamba 线性注意力模块(MFM),融合频域和空域特征,提升多尺度、复杂场景下的目标检测能力

在伪装物体检测领域&#xff0c;现有方法大多依赖空间局部特征&#xff0c;难以有效捕捉全局信息&#xff0c;而 Transformer 类方法虽能建模长距离依赖关系&#xff0c;却存在计算成本高、网络结构复杂的问题。同时&#xff0c;频域特征虽具备全局建模能力&#xff0c;可频繁的…

Dify的默认端口怎么修改

1.定位配置文件 在 Dify 的安装目录中找到 .env 文件&#xff08;通常位于 docker/ 子目录下&#xff09;。此文件定义了 Docker 容器的环境变量&#xff0c;包括端口配置。 2.调整端口参数 修改以下两个关键配置项&#xff1a; # Docker 容器内部 Nginx 监听的端口&#xf…

Go内存分配

图解Go语言内存分配 - 知乎 go内置运行时&#xff0c;采用了自主管理&#xff0c;实现更好的内存使用模式&#xff0c;不需要每次内存分配都进行系统调用 采用TCMalloc算法&#xff1a;把内存分为多级管理&#xff0c;从而降低锁的粒度 将可用的堆内存采用二级分配的方式进行…

cursor使用mcp连接mysql数据库,url方式

背景。 用cursor生成后端代码。让cursor可以创建响应的表结构以及插入数据。使用的cursor版本是1.2.1 cursor 官网 mcp 说明smithery 中mysql mcp这个mcp具有建表的本领。 在cursor中是这样配置的。 以上这种配置方式是是通过在smithery 网站中配置好自己的mysql数据库连接后才…

Twisted study notes[1]

文章目录serverreferencesserver Twisted usually using subclass twisted.internet.protocol.Protocol to treat protocols .Protocol is a fundamental class in Twisted for implementing network protocols.protocol class instant don’t exists forever because of it w…

Python 数据建模与分析项目实战预备 Day 6 - 多模型对比与交叉验证验证策略

✅ 今日目标 引入多种常见分类模型&#xff08;随机森林、支持向量机、K近邻等&#xff09;比较不同模型的训练效果使用交叉验证提升评估稳定性&#x1f9fe; 一、对比模型列表模型类名&#xff08;sklearn&#xff09;适用说明逻辑回归LogisticRegression基础线、易于解释KNNK…