1. 轮转数组问题概述
轮转数组(Rotate Array)是算法领域的一个经典问题,它要求我们将一个数组中的元素向右轮转k个位置。这个问题看似简单,但蕴含着数组操作、空间复杂度优化等核心编程思想。在实际开发中,类似操作常见于缓存管理、环形缓冲区等场景。
我第一次遇到这个问题是在处理图像像素矩阵旋转时,需要将二维数组的行元素进行循环移位。当时尝试了几种不同解法后,发现临时数组法在代码可读性和实现效率上达到了很好的平衡。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 临时数组法原理剖析
2.1 基本思路解析
临时数组法的核心思想是创建一个新数组,按照轮转后的元素顺序进行存储。具体步骤分为三步走:
- 计算实际有效轮转次数:k % nums.length(避免多余轮转)
- 将原数组后k个元素存入临时数组前部
- 将原数组前n-k个元素存入临时数组后部
这种方法的时间复杂度为O(n),空间复杂度也是O(n),属于典型的用空间换时间策略。对于现代计算机而言,这种线性空间开销在多数场景下都是可接受的。
2.2 数学位置映射
理解元素位置映射关系是掌握该算法的关键。设原数组为nums,长度为n,轮转k次后:
- 原数组中索引i的元素(i < n-k)将移动到新位置i+k
- 原数组中索引i的元素(i ≥ n-k)将移动到新位置i-(n-k)
这个映射关系可以通过取模运算统一表示为:(i + k) % n。我在白板上反复推导这个关系式时,发现用钟表盘面来类比特别直观——就像把12小时制的时针位置向右拨动k小时。
3. 代码实现与优化
3.1 基础实现版本
java复制public void rotate(int[] nums, int k) {
int n = nums.length;
k = k % n;
int[] temp = new int[n];
// 拷贝后k个元素
System.arraycopy(nums, n - k, temp, 0, k);
// 拷贝前n-k个元素
System.arraycopy(nums, 0, temp, k, n - k);
// 回写原数组
System.arraycopy(temp, 0, nums, 0,
