news 2026/4/23 5:13:04

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

作者头像

张小明

前端开发工程师

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/31 5:41:03

跟对公司,三年顶十年

某芯片公司上市&#xff0c;很多老员工直接财务自由。朋友圈里一片柠檬味&#xff0c;都在感慨"命好"。但这事儿真的只是运气吗&#xff1f;上市确实能让员工拿到超额回报&#xff0c;但这种回报本质上是对"风险定价"的兑现。早期加入一家公司&#xff0c;…

作者头像 李华
网站建设 2026/4/16 5:54:41

Git使用[远程仓库远端的head比本地和提交的head旧,其他人拉不到最新代码]

远程仓库远端的head比本地和提交的head旧,其他人拉不到最新代码 今天遇到一个超级奇葩的问题,我明明已经提交了代码,而且在浏览器看到的最新代码已经是我提交的了,但是其他同事拉取的时候总是上一个版本的,这让我一头雾水:克隆这个残酷拉取也是上一个版本的代码:这我就非常懵逼…

作者头像 李华
网站建设 2026/4/19 0:56:39

Hadoop生态系统构建的淘宝商品大数据分析与可视化平台(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

Hadoop生态系统构建的淘宝商品大数据分析与可视化平台(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码&#xff0c;实现了从数据采集、清洗存储、多维度分析到可视化展示的完整数据处理链路。系统采用分层架构设计&#xff0c;…

作者头像 李华
网站建设 2026/4/10 19:48:42

VSCode配置Hunyuan-MT 7B开发环境:从零开始的Python翻译插件开发

VSCode配置Hunyuan-MT 7B开发环境&#xff1a;从零开始的Python翻译插件开发 1. 为什么选择Hunyuan-MT 7B作为VSCode翻译插件的核心引擎 最近在给团队搭建多语言开发环境时&#xff0c;我试过不少翻译模型&#xff0c;但真正让我停下来认真研究的&#xff0c;是腾讯开源的Hun…

作者头像 李华
网站建设 2026/4/18 8:25:10

AI净界-RMBG-1.4实战案例:为在线教育平台生成万套课件透明图标

AI净界-RMBG-1.4实战案例&#xff1a;为在线教育平台生成万套课件透明图标 1. 为什么在线教育平台急需“透明图标”&#xff1f; 你有没有注意过&#xff0c;现在打开一个在线课程页面&#xff0c;满屏都是带白边、灰底、阴影的图标&#xff1f;这些图标看着规整&#xff0c;…

作者头像 李华
网站建设 2026/4/18 7:43:13

立知-lychee-rerank-mm与Typora集成:智能文档排序插件

立知-lychee-rerank-mm与Typora集成&#xff1a;智能文档排序插件 你是不是也遇到过这种情况&#xff1f;电脑里存了几百篇Markdown笔记&#xff0c;有技术总结、读书心得、项目规划&#xff0c;还有随手记下的灵感。每次想找一篇关于“Python异步编程”的旧笔记&#xff0c;都…

作者头像 李华