轮转数组
- 给定一个整数数组 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]
解题思路1
- 1、使用反转数组的方法来实现数组的向右旋转。
- 2、首先,将整个数组反转。
- 3、然后,将数组的前 k 个元素反转。
- 4、最后,将数组剩余的元素(即第 k 个元素之后的元素)反转。
- 5、这样就能够实现整个数组向右旋转 k 个位置
java实现1
public class RotateArray {
public static void rotate(int[] nums, int k) {
int n = nums.length;
k %= n; // 确保 k 在数组长度范围内
reverse(nums, 0, n - 1); // 反转整个数组
reverse(nums, 0, k - 1); // 反转前 k 个元素
reverse(nums, k, n - 1); // 反转剩余的元素
}
private static void reverse(int[] nums, int start, int end) {
while (start < end) {
int temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
start++;
end--;
}
}
public static void main(String[] args) {
int[] nums = {1, 2, 3, 4, 5, 6, 7};
int k = 3;
rotate(nums, k);
// 输出旋转后的数组
for (int num : nums) {
System.out.print(num + " ");
}
}
}
时间空间复杂度1
- 时间复杂度:O(n),其中 n 是数组 nums 的长度,反转数组的时间复杂度为 O(n)。
- 空间复杂度:O(1),原地修改数组
解题思路2
一种简单的方式是使用额外的数组来存储旋转后的结果
java实现2
public class RotateArray {
public static void rotate(int[] nums, int k) {
int n = nums.length;
k = k % n; // 处理 k 大于数组长度的情况
// 创建额外的数组用于存储旋转后的结果
int[] rotated = new int[n];
for (int i = 0; i < n; i++) {
rotated[(i + k) % n] = nums[i];
}
// 将旋转后的结果复制回原数组
System.arraycopy(rotated, 0, nums, 0, n);
}
public static void main(String[] args) {
int[] nums = {1, 2, 3, 4, 5, 6, 7};
int k = 3;
rotate(nums, k);
// 输出旋转后的数组
for (int num : nums) {
System.out.print(num + " ");
}
}
}
时间空间复杂度2
- 时间复杂度:O(n),其中 n 是数组 nums 的长度
- 空间复杂度:O(n),其中 n 是数组 nums 的长度