这道题想做出来很简单,设置成中等题应该是因为它的进阶要求:用空间复杂度为 O(1) 的算法解决
- 常规解法:额外数组
额外创建新数组,遍历存放元素轮转后的结果
时间复杂度:O(n)
空间复杂度:O(n)
代码如下:
public static void rotate(int[] nums, int k) {
int n = nums.length;
//确保 k 的有效性
k %= n;
int[] ans = new int[n];
for (int i = 0; i < n; i++) {
ans[(i + k) % n] = nums[i];
}
System.arraycopy(ans, 0, nums, 0, n);
}
- 翻转数组
三次翻转,先整体翻转,然后以 k 为界左右两边分别翻转,就相当于右移了 k 位
时间复杂度:O(n)
空间复杂度:O(1)
具体数学证明可参考:
LeetCode 189. 轮转数组
代码如下:
public static void rotate(int[] nums, int k) {
int n = nums.length;
k %= n;
reserve(nums, 0, n - 1);
reserve(nums, 0, k - 1);
reserve(nums, k, n - 1);
}
public static void reserve(int[] nums, int start, int end) {
while (start < end) {
int tmp = nums[start];
nums[start] = nums[end];
nums[end] = tmp;
start++;
end--;
}
}