力扣算法189:轮转数组 —— 进阶版:空间复杂度 O(1)
题目:给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
为了解决这个问题,我们需要将数组中的元素向右轮转 k 个位置。其实可以使用多种方法来实现这个目标,但这里提供一种最高效的方法,空间复杂度为 O( 1 ),即通过反转数组的特定部分来实现轮转。
核心思路:
首先,反转整个数组。
然后,反转前 k 个元素。
最后,反转剩余的元素。
为什么能这么做呢?可以观察这个题结果的规律。
对于原数组 [1, 2, 3, 4, 5, 6, 7],结果数组为 [5, 6, 7, 1, 2, 3, 4]
我们先把原数组元素全部反转一遍得到 **[7, 6, 5, 4, 3, 2, 1]**。
然后观察它,发现前K个元素(7, 6, 5)再反转一遍得到(5, 6, 7),剩下的元素(4, 3, 2, 1)再反转一遍得到(1, 2, 3, 4)。
把(5, 6, 7)与(1, 2, 3, 4 )连起来不就是结果数组嘛
我的 Java 代码:
public class Solution {
public void rotate(int[] nums, int k) {
if (nums == null || nums.length == 0) {
return;
}
int n = nums.length;
k = k % n; // 处理 k 大于 n 的情况
// 1.反转整个数组
reverse(nums, 0, n - 1);
// 2.反转前 k 个元素
reverse(nums, 0, k - 1);
// 3.反转剩余的元素
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--;
}
}
}
对于输入 nums = [1, 2, 3, 4, 5, 6, 7] 和 k = 3,程序的运行过程如下:
-
反转整个数组:[7, 6, 5, 4, 3, 2, 1]
-
反转前 3 个元素:[5, 6, 7, 4, 3, 2, 1]
-
反转剩余的元素:[5, 6, 7, 1, 2, 3, 4]
最终,数组变为 [5, 6, 7, 1, 2, 3, 4]
所有正文内容皆为本人原创,禁止搬运