news 2026/6/10 12:48:01

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

作者头像

张小明

前端开发工程师

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/6/9 22:22:21

随便学学-py集合+py算法基础

py算法基础常用输入第一行输入数字个数n&#xff0c;第二行输入n个数字n int(input()) # 第一行&#xff1a;数字个数 arr list(map(int, input().split())) # 第二行&#xff1a;n个数字输入三个数字a, b, c map(int, input().split()) # 一行3个数字二维数组n, m map(…

作者头像 李华
网站建设 2026/6/10 11:10:58

GLM-4V-9B部署实录:从镜像pull到首条图文对话成功仅需8分钟

GLM-4V-9B部署实录&#xff1a;从镜像pull到首条图文对话成功仅需8分钟 你是不是也试过下载一个号称“本地可跑”的多模态模型&#xff0c;结果卡在环境报错、显存爆炸、图片上传后模型复读路径、或者干脆输出一堆乱码&#xff1f;别急&#xff0c;这次我们不讲原理&#xff0…

作者头像 李华
网站建设 2026/6/10 11:27:24

使用Jimeng LoRA优化算法设计与实现

使用Jimeng LoRA优化算法设计与实现 算法设计这事儿&#xff0c;有时候挺让人头疼的。你想啊&#xff0c;好不容易琢磨出一个思路&#xff0c;写出来一跑&#xff0c;要么慢得像蜗牛&#xff0c;要么内存直接爆掉。调优就更别提了&#xff0c;改来改去&#xff0c;效果没见好多…

作者头像 李华
网站建设 2026/6/10 10:58:13

EcomGPT-7B部署教程:Transformers 4.45.0避坑指南与安全版本适配

EcomGPT-7B部署教程&#xff1a;Transformers 4.45.0避坑指南与安全版本适配 电商从业者每天要处理成百上千条商品信息——写标题、填属性、翻英文、凑文案&#xff0c;重复劳动多、出错风险高、跨境合规难。有没有一个工具&#xff0c;能像老同事一样懂行、反应快、不嫌烦&am…

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

AI编程助手隐私安全怎么做?opencode离线模式部署详解

AI编程助手隐私安全怎么做&#xff1f;OpenCode离线模式部署详解 1. 为什么AI编程助手需要真正离线&#xff1f; 写代码时&#xff0c;你有没有过这样的犹豫&#xff1a;把公司项目拖进一个网页版AI工具里&#xff0c;它会不会悄悄记住我的业务逻辑&#xff1f;把核心算法发给…

作者头像 李华
网站建设 2026/6/10 9:09:03

Qwen3-4B Instruct-2507实战案例:DevOps自动化脚本生成

Qwen3-4B Instruct-2507实战案例&#xff1a;DevOps自动化脚本生成 1. 为什么DevOps工程师需要一个“会写脚本的AI搭档” 你有没有过这样的经历&#xff1a;凌晨两点&#xff0c;线上服务突然告警&#xff0c;排查发现是某个定时任务没跑成功&#xff1b;翻日志发现crontab配…

作者头像 李华