💻 [LeetCode Hot100] 轮转数组|三次反转法,Java实现!图解+代码,小白也能秒懂!
✏️本文对应题目链接:轮转数组
📌 题目描述
给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
示例:
输入: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]
🧠 解题思路(图文分解)
❗ 核心难点
如何在O(n)时间复杂度内完成数组轮转?
方法一:三次反转法(黄金思路)✨
关键步骤:
- 整体反转:将整个数组反转
- 部分反转:反转前
k个元素 - 部分反转:反转剩余元素
图解三次反转法
输入数组:
nums = [1,2,3,4,5,6,7], k = 3
步骤1:整体反转
反转后:[7,6,5,4,3,2,1]
步骤2:反转前 k 个元素
反转后:[5,6,7,4,3,2,1]
步骤3:反转剩余元素
反转后:[5,6,7,1,2,3,4]
最终结果:
nums = [5,6,7,1,2,3,4]
🚀 代码实现
class Solution {
public void rotate(int[] nums, int k) {
int n = nums.length;
k = k % n; // 处理 k 大于数组长度的情况
// 整体反转
reverse(nums, 0, n - 1);
// 反转前 k 个元素
reverse(nums, 0, k - 1);
// 反转剩余元素
reverse(nums, k, n - 1);
}
// 反转数组的指定区间
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(1) → 原地修改数组,仅使用常数空间
方法二:环状替换(进阶思路)
关键思路:将数组视为环形,通过替换元素实现轮转。
class Solution {
public void rotate(int[] nums, int k) {
int n = nums.length;
k = 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 (start != current);
}
}
}
🌟 总结要点
✅ 三次反转核心思想:通过反转实现数组轮转
✅ 环状替换适用场景:空间复杂度要求极低的情况
✅ 适用场景:数组旋转、字符串旋转等问题
1万+

被折叠的 条评论
为什么被折叠?



