链接:
189. 轮转数组 - 力扣(LeetCode) (leetcode-cn.com)
题设:
给你一个数组,将数组中的元素向右轮转 k
个位置,其中 k
是非负数。
利用JAVA实现:
创建新数组来实现轮转:
class Solution {
public void rotate(int[] nums, int k) {
int n = nums.length;
int[] newArr = new int[n];
for (int i = 0; i < n; ++i) {
newArr[(i + k) % n] = nums[i];
}
System.arraycopy(newArr, 0, nums, 0, n);
}
}
其中的arraycopy方法:(数组复制)如何实现数组复制
时间复杂度: O(n),其中 n 为数组的长度。
空间复杂度: O(n)。
环转替换实现:
class Solution {
public void rotate(int[] nums, int k) {
int n = nums.length;
k = k % n;
int count = gcd(k, n);
for (int start = 0; start < count; ++start) {
int current = start;
int prev = nums[start];
do {
int next = (current + k) % n;
int temp = nums[next];
nums[next] = prev;
prev = temp;
current = next;
} while (start != current);
}
}
public int gcd(int x, int y) {
return y > 0 ? gcd(y, x % y) : x;
}
}
时间复杂度:O(n),其中 n 为数组的长度。每个元素只会被遍历一次。
空间复杂度:O(1)。我们只需常数空间存放若干变量
两方法对比