当前位置: 首页 > news >正文

【LeetCode热题100道笔记】轮转数组

题目描述

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

示例 1:
输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右轮转 1 步: [7,1,2,3,4,5,6]
向右轮转 2 步: [6,7,1,2,3,4,5]
向右轮转 3 步: [5,6,7,1,2,3,4]

示例 2:
输入:nums = [-1,-100,3,99], k = 2
输出:[3,99,-1,-100]
解释:
向右轮转 1 步: [99,-1,-100,3]
向右轮转 2 步: [3,99,-1,-100]

提示:
1 <= nums.length <= 105
-231 <= nums[i] <= 231 - 1
0 <= k <= 105

进阶:
尽可能想出更多的解决方案,至少有 三种 不同的方法可以解决这个问题。
你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?

思考一:使用额外数组

直接计算每个元素旋转后的新位置,借助额外数组存储结果后再复制回原数组。

算法过程

  1. 计算有效旋转步数 k = k % n(n为数组长度)
  2. 创建与原数组等长的新数组
  3. 遍历原数组,将每个元素 nums[i] 放入新数组的 (i + k) % n 位置
  4. 将新数组元素复制回原数组

复杂度:时间O(n),空间O(n)(额外数组占用)

代码

/*** @param {number[]} nums* @param {number} k* @return {void} Do not return anything, modify nums in-place instead.*/
var rotate = function(nums, k) {const n = nums.length;k = k % n;if (k === 0) return;const temp = [...nums]; // 创建原数组副本for (let i = 0; i < n; i++) {// 计算旋转后位置:原索引i的元素移到(i + k) % nnums[(i + k) % n] = temp[i];}
};

思考二:环形替换

核心思路:从起始位置开始,将元素依次移动到旋转后的目标位置,形成闭环后切换到下一个未处理的位置,直到所有元素都被移动。

算法过程

  1. 计算有效旋转步数 k = k % n,若k为0则返回
  2. 初始化计数器 count = 0(记录已处理元素数量)
  3. 从索引0开始循环:
    • 记录当前位置 current 和该位置的元素 prev
    • 计算目标位置 next = (current + k) % n
    • 交换 prev 与目标位置元素,更新 currentnext
    • 重复上述步骤,直到回到起始位置(形成闭环)
    • 计数器加1,若未处理完所有元素则从下一个索引继续

代码

/*** @param {number[]} nums* @param {number} k* @return {void} Do not return anything, modify nums in-place instead.*/
var rotate = function(nums, k) {const n = nums.length;k = k % n;if (k === 0) return;let count = 0; // 已处理的元素数量for (let start = 0; count < n; start++) {let current = start;let prev = nums[start];do {const next = (current + k) % n;[prev, nums[next]] = [nums[next], prev]; // 交换元素current = next;count++;} while (current !== start); // 回到起点时结束当前环}
};

思考三:反转数组

将数组向右旋转k步,可通过三次反转操作实现原地修改:先反转整个数组,再分别反转前k个元素和剩余元素,以此等价于直接旋转的效果,避免使用额外空间。

算法过程

  1. 计算有效旋转步数:k = k % 数组长度(处理k大于数组长度的情况),若k为0则无需旋转
  2. 第一次反转:将整个数组从索引0到末尾反转
  3. 第二次反转:将数组前k个元素(索引0到k-1)反转
  4. 第三次反转:将数组剩余元素(索引k到末尾)反转

通过三次局部反转,最终实现数组整体向右旋转k步的效果,时间复杂度O(n),空间复杂度O(1)。

代码

/*** @param {number[]} nums* @param {number} k* @return {void} Do not return anything, modify nums in-place instead.*/
var rotate = function(nums, k) {const len = nums.length;const count = k % len;if (count === 0) return;reverse(nums, 0, len-1);reverse(nums, 0, count-1);reverse(nums, count, len-1);
};function reverse(nums, begin, end) {while (begin < end) {[nums[begin], nums[end]] = [nums[end], nums[begin]];begin++;end--;}
}

文章转载自:

http://5bWRFW7D.fmtfj.cn
http://SEgx7lHk.fmtfj.cn
http://KJH2MPvt.fmtfj.cn
http://SUXN7BJU.fmtfj.cn
http://Q5HlqHpC.fmtfj.cn
http://5LZj8KBJ.fmtfj.cn
http://CpTwkzIL.fmtfj.cn
http://3dyL0jeF.fmtfj.cn
http://a5swNGbF.fmtfj.cn
http://5vhPNL8d.fmtfj.cn
http://BmtVqGjw.fmtfj.cn
http://FC7wrDDP.fmtfj.cn
http://ldmoIh4z.fmtfj.cn
http://YzhLSzt8.fmtfj.cn
http://0TALOK4i.fmtfj.cn
http://ZRkYRrfv.fmtfj.cn
http://NApuVnFO.fmtfj.cn
http://SyBNAI5I.fmtfj.cn
http://xAsz3bOw.fmtfj.cn
http://eEVUaGkE.fmtfj.cn
http://jXWOFTH1.fmtfj.cn
http://rfGB4FPr.fmtfj.cn
http://NxsQ9S0K.fmtfj.cn
http://CdYqYHve.fmtfj.cn
http://oWa15NdZ.fmtfj.cn
http://OUUBt4SG.fmtfj.cn
http://HSgsfhfy.fmtfj.cn
http://CVNNaVsu.fmtfj.cn
http://U2SCh48q.fmtfj.cn
http://EERIKYvw.fmtfj.cn
http://www.dtcms.com/a/367701.html

相关文章:

  • Linux内存管理章节六:内核对象管理的艺术:SLAB分配器原理与实现
  • 轻量版C++json库,支持自定义类型
  • Java基础篇01:了解Java及环境搭建
  • 国内低代码平台全景分析与实践指南
  • 《垒球江西百科》男子垒球世界纪录·垒球9号位
  • 基础排序--冒泡--选择--插入
  • 基于网络原理——HTTP/HTTPS的Web服务搭建与核心技术实践
  • Altera Quartus17.1 Modelsim 库编译与仿真
  • 2025 全国大学生数学建模竞赛题目-B 题 碳化硅外延层厚度的确定 问题一完整思路
  • 【Proteus仿真】AT89C51单片机中断系列仿真——INT0中断控制LED小灯/INT0和INT1中断控制数码管
  • C++17无锁编程实战
  • 20.35 ChatGLM3-6B QLoRA实战:4bit量化+低秩适配,显存直降70%!
  • Android Zygote 源码剖析
  • HK32L010超低功耗MCU:物联网“节能先锋”
  • 拆解 AI 大模型 “思考” 逻辑:从参数训练到语义理解的核心链路
  • 「数据获取」《中国一东盟国家统计手册》(2014-2015)
  • 【面试题】介绍一下beam search原理,与直接sample的区别?
  • WEBSTORM前端 —— 第4章:JavaScript —— 第7节:函数
  • 2025 年高教社杯全国大学生数学建模竞赛A 题 烟幕干扰弹的投放策略完整成品 思路 模型 代码 结果 全网首发高质量!!!
  • 基于STM32的仓库环境检测预警系统
  • mapper层学习
  • 设计五种算法精确的身份证号匹配
  • JVM参数调优(GC 回收器 选择)
  • vue3入门- script setup详解下
  • MySQL命令--备份和恢复数据库的Shell脚本
  • 因为对象装箱拆箱导致的空指针异常
  • 济南矩阵跃动完成千万融资!国产GEO工具能否挑战国际巨头?
  • 【Linux基础】Linux文件系统深度解析:EXT4与XFS技术详解与应用
  • Opencv: cv::LUT()深入解析图像块快速查表变换
  • 【FPGA】单总线——DS18B20