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

LeetCode 189. 轮转数组(C语言详解|三种解法 + 图解)

一、题目描述

给定一个整数数组nums,将数组中的元素向右轮转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️⃣ 使用额外数组
2️⃣ 环状替换(Cycle Replacement)
3️⃣ 数组翻转(最经典)


三、解法一:额外数组

思路

将元素直接放到旋转后的正确位置

元素nums[i]的新位置是:

(i + k) % n

示例:

nums = [1,2,3,4,5,6,7] k = 3 n = 7

位置变化:

0 → 3 1 → 4 2 → 5 3 → 6 4 → 0 5 → 1 6 → 2

C语言代码

void rotate(int* nums, int numsSize, int k) { int* temp = (int*)malloc(sizeof(int) * numsSize); k = k % numsSize; for(int i = 0; i < numsSize; i++) { temp[(i + k) % numsSize] = nums[i]; } for(int i = 0; i < numsSize; i++) { nums[i] = temp[i]; } free(temp); }

复杂度分析

时间复杂度:O(n) 空间复杂度:O(n)

缺点:需要额外数组。


四、解法二:环状替换(Cycle Replacement)

思路

数组旋转其实会形成若干个循环

例如:

nums = [1,2,3,4,5,6,7] k = 3

移动路径:

0 → 3 → 6 → 2 → 5 → 1 → 4 → 0

每次把元素放到(current + k) % n的位置。

需要记录移动次数count,直到所有元素移动完成。


C语言代码

void rotate(int* nums, int numsSize, int k) { k = k % numsSize; int count = 0; for(int start = 0; count < numsSize; start++) { int current = start; int prev = nums[start]; do { int next = (current + k) % numsSize; int temp = nums[next]; nums[next] = prev; prev = temp; current = next; count++; } while(current != start); } }

复杂度分析

时间复杂度:O(n) 空间复杂度:O(1)

优点:

  • 不需要额外空间

缺点:

  • 逻辑稍复杂


五、解法三:数组翻转(最经典)

这是面试最推荐的方法⭐⭐⭐⭐

核心思想:

通过三次翻转实现数组旋转。


举例

nums = [1,2,3,4,5,6,7] k = 3

第一步:整体翻转

7 6 5 4 3 2 1

第二步:翻转前 k 个

5 6 7 4 3 2 1

第三步:翻转后 n-k 个

5 6 7 1 2 3 4

C语言代码

void reverse(int* nums, int left, int right) { while(left < right) { int temp = nums[left]; nums[left] = nums[right]; nums[right] = temp; left++; right--; } } void rotate(int* nums, int numsSize, int k) { k = k % numsSize; reverse(nums, 0, numsSize - 1); reverse(nums, 0, k - 1); reverse(nums, k, numsSize - 1); }

复杂度分析

时间复杂度:O(n) 空间复杂度:O(1)

优点:

  • 原地修改

  • 实现简单

  • 面试最常见


六、三种方法总结

方法时间复杂度空间复杂度推荐
额外数组O(n)O(n)
环状替换O(n)O(1)⭐⭐⭐
数组翻转O(n)O(1)⭐⭐⭐⭐

面试回答顺序建议:

先说:额外数组 再说:翻转法(最佳) 最后补充:环状替换

核心知识点

  • 数组旋转

  • 模运算(i + k) % n

  • 双指针翻转

  • 环状替换

http://www.jsqmd.com/news/511297/

相关文章:

  • OpenClaw飞书通道配置指南:WebSocket接入与安全认证
  • 2026年黑龙江口碑好的活动板房正规厂家推荐,景区活动板房全解析 - mypinpai
  • P4351 学习笔记
  • 【工信部等保2.0强制要求】:C语言国密模块性能达标指南(SM2签名≤8.2ms@1.2GHz,附GCC 12.3 -O3 -march=native调优清单)
  • 嵌入式累加和校验算法原理与实战
  • LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置(C语言 | 二分查找)
  • 机器人控制算法实战:从PID到神经网络,如何选择最适合你的方案?
  • RK3576嵌入式平台Docker部署与NPU容器化实践
  • 2026六大城市高端腕表“指针损伤”终极档案:从劳力士夜光脱落到爱彼针片变形,那三根针正在悄悄告诉你什么? - 时光修表匠
  • 波利亚数学方法论 | 猜测、证明与建构在〈数学分析中问题与定理〉中的实践简述
  • 小众+热门全覆盖|六大城市高端腕表养护维修全攻略(全新版) - 时光修表匠
  • Linux基础学习二
  • 2026年有实力的车身改色品牌企业推荐,鹰潭地区优选 - 工业品牌热点
  • 微信小程序 洗衣店 干洗店预约系统
  • 别再傻傻分不清了!SSH端口转发三兄弟(-L/-R/-D)保姆级实战指南
  • MySQL中DROP、TRUNCATE和DELETE
  • 组态技术解析:从概念到典型应用场景
  • 探讨高性价比的车身改色企业,鹰潭怎么选择? - myqiye
  • 继电器模块原理与嵌入式驱动设计实战
  • RK3576嵌入式AI开发环境:离线代码生成与NPU推理实战
  • 238.除了自身以外数组的乘积
  • 聊聊立新菌种培训是否与时俱进,培训费用在行业中算高吗? - 工业推荐榜
  • vue3中const的使用和定义
  • Fiddler抓包工具的使用
  • MT5 Zero-Shot效果展示:短视频脚本多版本生成——情绪/长度/风格可控
  • QWEN-AUDIO新手入门:详解Vivian/Emma/Ryan/Jack四种音色怎么选
  • 分析2026年河南好用的食用菌培训企业,费用怎么算 - 工业设备
  • 通义千问1.5-1.8B-Chat-GPTQ-Int4实战:构建网络安全知识问答与漏洞分析助手
  • NAS硬盘兼容性扩展:突破群晖存储设备限制的技术方案
  • C++:引用