news 2026/3/29 8:58:54

普通数组----轮转数组

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
普通数组----轮转数组

🔥个人主页:Milestone-里程碑

❄️个人专栏: <<力扣hot100>> <<C++>><<Linux>>

<<Git>><<MySQL>>

🌟心向往之行必能至

题目描述

给定一个整数数组nums,将数组中的元素向右轮转k个位置,其中k是非负数。

示例 1输入:nums = [1,2,3,4,5,6,7],k = 3输出:[5,6,7,1,2,3,4]解释:向右轮转 3 步后,数组末尾的 3 个元素移动到了数组开头。

示例 2输入:nums = [-1,-100,3,99],k = 2输出:[3,99,-1,-100]


解法一:使用额外数组(直观易懂)

这是最容易想到的方法,通过一个临时数组来存储轮转后的结果,再拷贝回原数组。

思路

  1. 计算有效轮转步数x = k % nums.size(),避免 k 大于数组长度时的无效轮转。
  2. 创建临时数组temp,将原数组的后x个元素和前n-x个元素依次放入。
  3. 将临时数组的内容拷贝回原数组。

代码

cpp

void rotate(vector<int>& nums, int k) { int n = nums.size(); int x = k % n; vector<int> temp(n); for (int i = 0; i < n; ++i) { temp[(i + x) % n] = nums[i]; } nums = temp; }

复杂度分析

  • 时间复杂度:\(O(n)\),遍历一次数组。
  • 空间复杂度:\(O(n)\),需要额外的临时数组存储结果。

解法二:三次反转(原地算法,最优解)

这是这道题的最优解法,不需要额外空间,仅通过三次反转操作就可以完成轮转。

思路

  1. 计算有效步数x = k % nums.size(),处理 k 大于数组长度的情况。
  2. 第一次反转:将整个数组反转。
  3. 第二次反转:将数组的前x个元素反转。
  4. 第三次反转:将数组的剩余n-x个元素反转。

示例演示(以nums = [1,2,3,4,5,6,7],k=3为例)

  • 原数组:[1,2,3,4,5,6,7]
  • 整体反转:[7,6,5,4,3,2,1]
  • 反转前 3 个:[5,6,7,4,3,2,1]
  • 反转后 4 个:[5,6,7,1,2,3,4]

代码

cpp

#include <vector> #include <algorithm> using namespace std; class Solution { public: void rotate(vector<int>& nums, int k) { int n = nums.size(); int x = k % n; if (x == 0) return; // 1. 反转整个数组 reverse(nums.begin(), nums.end()); // 2. 反转前x个元素 reverse(nums.begin(), nums.begin() + x); // 3. 反转剩余元素 reverse(nums.begin() + x, nums.end()); } };

复杂度分析

  • 时间复杂度:\(O(n)\),三次反转操作的总时间为 \(O(n)\)。
  • 空间复杂度:\(O(1)\),仅使用常量级的额外空间。

解法三:环状替换(原地算法,进阶思路)

这是另一种原地算法,通过计算每个元素的目标位置,以环状的方式进行元素替换。

思路

  1. 计算有效步数x = k % nums.size()
  2. 从起始位置开始,将当前元素放到它轮转后的目标位置,再将目标位置的元素放到它的目标位置,直到回到起始位置。
  3. 如果一轮替换没有覆盖所有元素,则从下一个位置开始重复上述过程。

复杂度分析

  • 时间复杂度:\(O(n)\),每个元素只被移动一次。
  • 空间复杂度:\(O(1)\),仅使用常量级的额外空间。

三种解法对比

解法时间复杂度空间复杂度特点
额外数组\(O(n)\)\(O(n)\)思路简单,容易实现,但需要额外空间
三次反转\(O(n)\)\(O(1)\)最优解,原地操作,代码简洁高效
环状替换\(O(n)\)\(O(1)\)原地操作,但逻辑
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/25 12:21:49

基于Spark的豆瓣读书分析大屏可视化(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

基于Spark的豆瓣读书分析大屏可视化(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码数据采集&#xff1a;豆瓣读书网站爬虫(requests、lxml、…) 数据存储&#xff1a;将爬取的数据保存为csv文件&#xff0c;保存到本地或上传到…

作者头像 李华
网站建设 2026/3/25 7:21:19

CentOS7高效部署WebRTC信令服务器:从选型到性能调优实战

背景痛点&#xff1a;CentOS7部署WebRTC信令的“拦路虎” 在实时音视频应用开发中&#xff0c;WebRTC负责端到端的媒体传输&#xff0c;而信令服务器则是整个通信的“交通指挥中心”&#xff0c;负责协商建立连接。然而&#xff0c;在经典的CentOS 7服务器上部署一个高性能、稳…

作者头像 李华
网站建设 2026/3/27 7:59:59

2.08亿,可信数据空间及医疗健康专区数智一体化建设项目

2026 年 2 月 3 日&#xff0c; 惠州市惠阳区云智创大数据有限公司发布《惠州市惠阳区可信数据空间及医疗健康专区数智一体化建设项目》招标计划。一、项目信息&#xff1a;项目名称&#xff1a;惠州市惠阳区可信数据空间及医疗健康专区数智一体化建设项目预算&#xff1a;2078…

作者头像 李华
网站建设 2026/3/26 8:53:08

基于Spark深圳通刷卡数据分析可视化系统(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

基于Spark深圳通刷卡数据分析可视化系统(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码深圳通是深圳市广泛应用的公共交通智能卡系统&#xff0c;拥有超过4000万的发卡量&#xff0c;每日产生超过800万人次的刷卡记录&#xf…

作者头像 李华
网站建设 2026/3/20 8:51:15

Qwen3-Reranker-0.6B在LaTeX学术写作中的智能辅助

Qwen3-Reranker-0.6B在LaTeX学术写作中的智能辅助 1. 当你被文献淹没时&#xff0c;它悄悄帮你理清思路 写论文最让人头疼的时刻&#xff0c;往往不是敲代码或推公式&#xff0c;而是面对几百篇PDF发呆——明明知道某篇2018年的综述里提过这个观点&#xff0c;可翻了半小时还…

作者头像 李华
网站建设 2026/3/26 20:44:51

Qwen3-ASR-1.7B模型蒸馏实战:打造轻量级语音识别

Qwen3-ASR-1.7B模型蒸馏实战&#xff1a;打造轻量级语音识别 1. 为什么需要模型蒸馏 语音识别模型越强大&#xff0c;参数量往往越大。Qwen3-ASR-1.7B在多个评测中达到开源SOTA水平&#xff0c;但1.7B的参数量对很多实际场景来说还是太重了。比如在边缘设备上部署、做高并发实…

作者头像 李华