Leetcode 189: 轮转数组

Leetcode 189: 轮转数组

这是一道经典问题,题目要求将一个数组向右轮转 k 个位置,有多种解法可以快速求解,既可以通过额外空间,也可以在 O(1) 的空间复杂度内完成。本题考察数组操作、双指针,以及算法优化能力。


题目描述

输入:

  • 一个整数数组 nums
  • 一个整数 k(表示右移的次数)。

输出:

  • 将数组元素旋转 k 次后直接修改原数组,不返回值。

示例输入输出:

输入:nums = [1,2,3,4,5,6,7], k = 3
输出:[5,6,7,1,2,3,4]输入:nums = [-1,-100,3,99], k = 2
输出:[3,99,-1,-100]

解法 1:额外数组辅助

思路
  1. 使用一个额外的数组 temp 来保存最终的旋转结果。
  2. 拷贝操作
    • 遍历原数组,将 nums[i] 放置到新位置 (i + k) % n 中。
  3. 覆盖结果
    • temp 中的内容转存回原数组。

代码模板
class Solution {public void rotate(int[] nums, int k) {int n = nums.length;k %= n; // 如果 k 大于数组长度,需要取模int[] temp = new int[n];for (int i = 0; i < n; i++) {temp[(i + k) % n] = nums[i]; // 按照旋转后的位置存储}// 将 temp 的内容拷贝到原数组for (int i = 0; i < n; i++) {nums[i] = temp[i];}}
}

复杂度分析
  • 时间复杂度:O(n)
    • 遍历数组两次,一次构造 temp 数组,一次拷贝回原数组。
  • 空间复杂度:O(n)
    • 需要一个额外大小为 n 的数组存放临时结果。

解法 2:环状替换

思路
  1. 核心观察
    • 通过旋转,数组中的每个元素其实沿着环状路径被移动,例如第 i 个元素移动到位置 (i + k) % n
    • 从某个点出发,将该点开始的所有元素按照这种环状方式重新排列。
    • 当访问过的元素数量达到数组大小 n 时,正好完成所有元素的轮转。
  2. 实现步骤
    • 统计当前访问过的元素数量 count,从未访问过的某个起始点出发进行 “环绕替换”。
    • 对于每个元素,将其移至新位置 (i + k) % n,直到形成一个环,然后跳到下一个未访问的点。

代码模板
class Solution {public void rotate(int[] nums, int k) {int n = nums.length;k %= n; // 如果 k 大于数组长度,取模去掉多余轮转int count = 0; // 记录访问的元素数量for (int start = 0; count < n; start++) { // 从未访问的点开始int current = start; // 当前节点int prev = nums[start]; // 保存当前值do {int next = (current + k) % n; // 下一个位置int temp = nums[next]; // 保存下个位置的值nums[next] = prev; // 替换值prev = temp; // 更新 "前一个值"current = next; // 跳到下一个位置count++; // 更新访问数量} while (current != start); // 环绕回起点时退出}}
}

复杂度分析
  • 时间复杂度:O(n)
    • 每个元素最多被访问一次。
  • 空间复杂度:O(1)
    • 没有使用额外数据结构,原地旋转。

解法 3:数组翻转技巧

思路
  1. 数组轮转可以通过 三步翻转 实现:
    • 第 1 步:翻转整个数组;
    • 第 2 步:翻转前 k 个元素;
    • 第 3 步:翻转后 n-k 个元素。
  2. 实现原理:
    • 经过数组翻转操作后,元素将被正确排列。
    • 例如:对于输入 nums = [1,2,3,4,5,6,7], k=3
      原始: [1, 2, 3, 4, 5, 6, 7]
      步骤 1 翻转整个数组: [7, 6, 5, 4, 3, 2, 1]
      步骤 2 翻转前 k 个元素:[5, 6, 7, 4, 3, 2, 1]
      步骤 3 翻转后 n-k 个元素:[5, 6, 7, 1, 2, 3, 4]
      

代码模板
class Solution {public void rotate(int[] nums, int k) {int n = nums.length;k %= n; // 如果 k 大于数组长度,取模处理// 翻转函数reverse(nums, 0, n - 1); // 翻转整个数组reverse(nums, 0, k - 1); // 翻转前 k 个元素reverse(nums, k, n - 1); // 翻转后 n-k 个元素}private void reverse(int[] nums, int start, int end) {while (start < end) {int temp = nums[start];nums[start] = nums[end];nums[end] = temp;start++;end--;}}
}

复杂度分析
  • 时间复杂度:O(n)
    • 翻转整个数组花费 O(n),翻转前后两部分各花费 O(k) 和 O(n-k),总时间为 O(n)。
  • 空间复杂度:O(1)
    • 翻转操作原地完成,没有额外数据结构。

解法 4:双指针 + 循环节

思路
  • 使用双指针从两端到中间进行元素筛选调整。
  • 或者结合环状数组的位置动态安排记录。


总结:如何快速 AC?

  1. 优先选择三步翻转解法:O(n) 时间复杂度,O(1) 空间复杂度,实现简单,效率最高,是面试中优先推荐的解法。
  2. 针对特殊场景
    • 如果原数组不可修改,可以选择额外数组解法。
    • 如果需要一定技巧性(如比特运算分析竞赛题),环状替换法更具逻辑挑战。
  3. 边界情况注意
    • k 大于数组长度时,需要取模:k %= n
    • 空数组或 k=0 时,直接返回。

通过掌握以上 3 种高效解法(特别是三步翻转技巧),不仅可以轻松解决问题,还能给面试官留下深刻印象。

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

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

相关文章

优选算法的智慧之光:滑动窗口专题(二)

专栏&#xff1a;算法的魔法世界​​​​​​ 个人主页&#xff1a;手握风云 目录 一、例题讲解 1.1. 最大连续1的个数 III 1.2. 找到字符串中所有字母异位词 1.3. 串联所有单词的子串 1.4. 最小覆盖子串 一、例题讲解 1.1. 最大连续1的个数 III 题目要求是二进制数组&am…

Linux系统安装Azure CLI完全指南

引言 Azure CLI是管理Azure云服务的重要命令行工具。本文将详细介绍在Linux系统上安装Azure CLI的两种方法,并提供版本管理、故障排除等完整解决方案。 © ivwdcwso (ID: u012172506) 一、安装前准备 1.1 系统要求 支持的Linux发行版: Ubuntu 20.04/22.04 LTSDebian 10/…

2025嵌入式软件开发工程师--音频方向

一、选择题&#xff08;每题3分&#xff0c;共30分&#xff09; 1.以下哪个不是C语言中的关键字?&#xff08; &#xff09; A. int B. Float C. Define D. Return 2.以下代码的输出是: &#xff08; &#xff09; inta 5, b 10; printf("%d“, a b); A. 15 B.16 …

TCP/IP四层模型:从入门到精通

第一部分&#xff1a;基础概念 1.1 什么是TCP/IP&#xff1f; - TCP/IP 是互联网的基础通信协议簇&#xff0c;定义了数据如何在网络中传输和路由。 - 与OSI七层模型的对比&#xff1a;TCP/IP更简化&#xff0c;分为四层&#xff0c;注重实际应用。 1.2 四层模型结构 1. 应…

【Python 数据结构 1.零基础复习】

目录 一、输入与输出 1.输入 2.格式化输出 二、数字与变量 1.字符串 & 整型 2.字符串 & 整型 & 浮点型 3.变量 练习 2235. 两整数相加 三、运算与操作 1.四则运算 练习 2769. 找出最大的可达成数字 3.取整与取余 练习 2651. 计算列车到站时间 ​编辑 四、真与假 1…

什么是 MGX:MetaGPT

什么是 MGX:MetaGPT MetaGPT是由思码逸(OpenDILab)团队开发的一款专注于生成式AI驱动的软件开发框架,MGX可能是其衍生或升级的相关成果,它创新性地将大语言模型引入软件开发流程,模拟人类软件团队的协作方式,能让用户通过自然语言描述需求,即可自动生成完整的软件项目,…

大模型时代下的数据标注革命:工具、挑战与未来趋势

引言 随着大模型技术的飞速发展&#xff0c;人工智能对高质量标注数据的依赖愈发显著。传统的人工标注方式在效率、成本和场景适应性上逐渐显现瓶颈&#xff0c;而大模型凭借其强大的泛化能力和多模态理解能力&#xff0c;正在推动数据标注从“劳动密集型”向“智能工业化”转…

【azure openai】用tts实现语音对话【demo】

能实现&#xff1a; 只要替换里面的key&#xff0c;就能跑通。 key的查找方法&#xff1a; 【保姆级教程】如何在azure里快速找到openai的key和demo-CSDN博客 代码结构&#xff1a; azure_openai_client.py main.py prompts_config.py speech_utils.py stt01.py tts01.…

Spark(5)host配置

&#xff08;一.)host配置的作用&#xff1a; hosts 文件是一个本地的文本文件&#xff0c;它的作用是将主机名映射到对应的 IP 地址&#xff0c;在 DNS&#xff08;域名系统&#xff09;解析之前&#xff0c;系统会先查询 hosts 文件来确定目标主机的 IP 地址。 &#xff08;二…

Hive-04之存储格式、SerDe、企业级调优

一、主题 hive表的数据压缩和文件存储格式hive的自定义UDF函数hive的JDBC代码操作hive的SerDe介绍和使用hive的优化 二、要点 1. hive表的文件存储格式 Hive支持的存储数的格式主要有&#xff1a;TEXTFILE&#xff08;行式存储&#xff09; 、SEQUENCEFILE(行式存储)、ORC&…

Excel的行高、列宽单位不统一?还是LaTeX靠谱

想要生成田字格、米字格、带拼音标准&#xff0c;方便小学生书法和练字。Word&#xff0c;Excel之类所见即所得是最容易相当的方式。但它们处理带田字格之类背景时&#xff0c;如果没有专用模板、奇奇怪怪的插件&#xff0c;使用起来会碰到各种问题。比如&#xff0c;Word里面用…

[免费]微信小程序(校园)二手交易系统(uni-app+SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序(校园)二手交易系统(uni-appSpringBoot后端Vue管理端)&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序(校园)二手交易系统(uni-appSpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bi…

【详细讲解在STM32的UART通信中使用DMA机制】

详细讲解在STM32的UART通信中使用DMA机制 目录 详细讲解在STM32的UART通信中使用DMA机制一、DMA机制概述二、DMA在UART中的作用三、DMA的配置步骤四、UART初始化与DMA结合五、DMA传输的中断处理六、DMA与中断的结合使用七、注意事项与常见问题八、代码示例九、总结 一、DMA机制…

M系列芯片 MacOS 在 Conda 环境中安装 TensorFlow 2 和 Keras 3 完整指南

目录 1. 引言2. 环境准备3. 安装 TensorFlow 和必要依赖4. 结语Reference 1. 引言 Keras 是搞深度学习很可爱的工具&#xff0c;其友好的接口让我总是将其作为搭建模型原型的首选。然而&#xff0c;当我希望在 M 系列芯片的MacBook Pro上使用 Keras时&#xff0c;使用Conda和P…

清华北大DeepSeek六册

「清华北大-Deepseek使用手册」 链接&#xff1a;https://pan.quark.cn/s/98782f7d61dc 「清华大学Deepseek整理&#xff09; 1&#xff0d;6版本链接&#xff1a;https://pan.quark.cn/s/72194e32428a AI学术工具公测链接:https://pan.baidu.com/s/104w_uBB2F42Da0qnk78_ew …

paddlehub hub TypeError 错误

pip install paddlehub hub install chinese_ocr_db_crnn_mobile 提示错误&#xff1a; TypeError: Descriptors cannot be created directly. If this call came from a _pb2.py file, your generated code is out of date and must be regenerated with protoc > 3.19.0…

零信任沙箱:为网络安全筑牢“隔离墙”

在数字化浪潮汹涌澎湃的今天&#xff0c;网络安全如同一艘船在波涛汹涌的大海中航行&#xff0c;面临着重重挑战。数据泄露、恶意软件攻击、网络钓鱼等安全威胁层出不穷&#xff0c;让企业和个人用户防不胜防。而零信任沙箱&#xff0c;就像是一座坚固的“隔离墙”&#xff0c;…

【String】917. 仅仅反转字母

917. 仅仅反转字母 - 力扣&#xff08;LeetCode&#xff09; 使用双指针&#xff0c;一个指针指向s的开始&#xff0c;一个指向s的末尾&#xff0c;同时遍历即可。

大语言模型学习

大语言模型发展历程 当前国内外主流LLM模型 ‌一、国外主流LLM‌ ‌LLaMA2‌ Meta推出的开源模型&#xff0c;参数规模涵盖70亿至700亿&#xff0c;支持代码生成和多领域任务适配‌57。衍生版本包括Code Llama&#xff08;代码生成优化&#xff09;和Llama Chat&#xff08;对…

3dsmax烘焙光照贴图然后在unity中使用

效果预览 看不清[完蛋&#xff01;] 实现步骤 使用 软件 软体名称地址photoshophttps://www.adobe.com/products/photoshop.htmlunity3Dhttps://unity.com/3dsmaxhttps://www.autodesk.com.cn/products/3ds-max/free-trialpacker-iohttps://www.uv-packer.com/HDR 贴图地址…