LeetCode 189. 轮转数组:从直观模拟到最优原地算法

发布时间:2026/10/9 2:54:37

LeetCode 189. 轮转数组:从直观模拟到最优原地算法 1. 题目描述(题目链接)给定一个整数数组 nums将数组中的元素向右轮转 k 个位置其中 k 是非负数。示例输入: nums [1,2,3,4,5,6,7], k 3输出: [5,6,7,1,2,3,4]2. 方法一辅助数组法核心思想是开辟一个新的数组将原数组中的每个元素直接放到它最终应该在的位置上。核心公式推导对于原数组下标为 i 的元素向右轮转 k 位后它的新下标 new_index 为new_index (i k) % n 其中 n 为数组长度class Solution { public: void rotate(vectorint nums, int k) { int n nums.size(); vectorint nums2(n); // 将每个元素直接放到最终位置 for (int i 0; i n; i) { nums2[(i k) % n] nums[i]; } // 将新数组拷贝回原数组 nums nums2; } };复杂度分析时间复杂度 O(N)遍历一次数组。空间复杂度 O(N)需要创建一个与原数组等大的新数组。3. 方法二三次翻转法最优解这是本题在面试中最受青睐的解法。核心思路向右轮转 k 位本质上就是将数组的后 k 个元素移动到前面。我们可以通过以下三步实现整体翻转将整个数组翻转。此时原本在末尾的 k 个元素跑到了数组的最前面翻转前 k 个元素将这 k 个元素恢复顺序。翻转剩余的 n-k 个元素将剩余元素恢复顺序。演示假设 nums [1,2,3,4,5,6,7], k 3整体翻转 [1,2,3,4,5,6,7] - [7,6,5,4,3,2,1]翻转前 k 个 (前3个) [7,6,5] - [5,6,7]。数组变为[5,6,7,4,3,2,1]翻转剩余部分 (后4个) [4,3,2,1] - [1,2,3,4]。数组变为[5,6,7,1,2,3,4] (完成)注意 如果 k 大于数组长度需要先进行 k k % n 取余操作因为轮转 n 次等于没轮转。代码实现 (C)class Solution { public: void rotate(vectorint nums, int k) { int n nums.size(); k k % n; // 处理 k n 的情况 // 使用 C STL 的 reverse 函数 reverse(nums.begin(), nums.end()); // 1. 整体翻转 reverse(nums.begin(), nums.begin() k); // 2. 翻转前 k 个 reverse(nums.begin() k, nums.end()); // 3. 翻转剩余部分 } };复杂度分析时间复杂度ON每个元素被翻转了两次。空间复杂度O1原地修改不需要额外空间。4. 方法三环形替换法原地算法这也是一种O(1)空间的原地算法但逻辑比三次翻转法更复杂。核心思路我们可以直接把每个元素放到它最终的位置上。如果我们从下标 0 开始将 nums[0] 移动到 (0k)%n然后继续移动被覆盖的元素我们会形成一个闭环。但是如果 n 和 k 的最大公约数大于 1我们会在回到起点时还有元素没有移动。因此我们需要从下一个下标开始继续这个过程直到所有元素都被移动。代码实现class Solution { public: void rotate(vectorint nums, int k) { int n nums.size(); k k % n; int count 0; // 记录已移动的元素个数 // 当已移动元素数小于 n 时继续 for (int start 0; count n; start) { int current start; int prev nums[start]; do { // 计算下一个位置 int next (current k) % n; // 暂存下一个位置的值并将 prev 放入 swap(nums[next], prev); // 移动到下一个位置 current next; count; } while (start ! current); // 形成闭环后退出 } } };复杂度分析时间复杂度 O(N)每个元素只被访问和移动一次。空间复杂度 O(1)。5. 总结算法名称时间复杂度空间复杂度辅助数组法O(N)O(N)三次翻转法O(N)O(1)环形替换法O(N)O(1)
延伸阅读

更多相关文章

2026/10/9 3:44:39

AI工具解析春节前A股震荡市:板块轮动与操作策略

今天A股这个盘面,说实话挺有意思的。我早上用AI工具把昨夜到今晨的全球市场数据、宏观消息、行业舆情全部过了一遍,再把几个主流模型的判断交叉比对了一下,得出的结论是:这周第一天,指数层面大概率还是震荡&#xff0c…

2026/10/9 3:44:39

达梦数据库模式查询指南:用户即模式,四条SQL带你摸清Schema

做达梦数据库运维和开发的朋友,十有八九都碰到过这么一个问题:拿到一个达梦实例的连接串,登录进去之后想第一时间摸清楚“当前数据库下到底有哪些模式(Schema)”。尤其是从 MySQL 或 Oracle 迁移过来的团队&#xff0c…

2026/10/9 3:44:39

企业级AI Agent架构:LangGraph与MCP协同实现结构化输出与可靠工具调用

1. 项目概述:为什么企业级问答系统必须解决“结构化输出”与“工具调用”这道坎我带团队落地过7个行业客户的真实智能问答项目,从金融知识库到制造业设备手册,再到政务政策咨询系统——所有项目在POC阶段跑通基础问答后,无一例外卡…

2026/10/9 3:44:39

运输层协议原理与工程实践:从TCP/UDP到状态机实现

简介:本资源是一份面向计算机网络初学者与高校相关专业学生的《计算机网络自顶向下》教学课件PPT,聚焦运输层核心原理与协议机制,系统讲解多路复用/分解、TCP可靠传输(连接管理、流量控制、拥塞控制)、UDP无连接特性及…

2026/10/9 3:44:39

DeepSeek 八大行业调参实战:温度、top_p 与提示词配置指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 3:39:39

重要时期安全保障服务:从战时态到闭环值守的全流程解析

简介:面向政企单位信息安全负责人、项目集成人员与方案编写者的重要时期安全保障服务技术方案。文档以重大政治经济时期的业务连续性为着眼点,完整覆盖防护准备、监控预警、应急处置与复盘改进等环节,并明确对标ISO/IEC 27001、GB/T 20984等标…

2026/10/8 10:03:18

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/8 10:03:20

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/8 6:05:44

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 0:04:27

毕业论文初稿完成后首次进行AIGC疑似度自查的摸底与分流策略

毕业论文初稿完成后首次进行AIGC疑似度自查的摸底与分流策略当数万字的学位论文初稿经历开题、实验、问卷与多轮文献梳理最终成形时,绝大多数研究生都会面临一道全新的形式审查关卡:AIGC 疑似度排查。在高校毕业审核流程中,盲审前的文本检测通…

2026/10/9 0:04:27

食堂节能改造源头工厂,商用厨房设备焕新方案广受好评

商用厨房作为餐饮经营、单位供餐的核心后勤阵地,其设备配置、动线规划与运维体系直接决定后厨作业效率、运营成本与合规性。从基础的灶具、制冷存储设备,到油烟净化、水处理等配套系统,每一个环节的合理性都与食品安全、能耗管控、消防安全挂…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑