轮转数组
理解题目:
题目要求将给定数组进行轮转,即将数组中的元素向右移动 k 步,其中 k 是非负数。
代码实现:
public class RotateArray {
// 轮转数组
public void rotate(int[] nums, int k) {
int n = nums.length;
k = k % n; // 处理 k 大于数组长度的情况
if (k == 0) return; // 如果 k 为 0,则无需进行任何操作
reverse(nums, 0, n - 1); // 整体反转数组
reverse(nums, 0, k - 1); // 反转前 k 个元素
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--;
}
}
}
步骤解释:
-
计算出需要轮转的步数 k,如果 k 为 0,则无需进行任何操作。
-
对数组进行三次反转操作:
- 首先,整体反转整个数组,这样最后的 k 个元素会被移动到数组的开头。
- 然后,反转前 k 个元素,将它们移动到数组的末尾。
-
最后,反转剩余的元素,将它们移动到数组的开头。
-
完成三次反转操作后,数组完成了轮转。
时间复杂度: 时间复杂度为 O(n),其中 n 是数组的长度。整体反转数组、反转前 k 个元素和反转剩余的元素都需要 O(n) 的时间。
空间复杂度: 只使用了常数级别的额外空间,空间复杂度为 O(1)。