题目描述:
给定一个整数数组 nums
,将数组中的元素向右轮转 k
个位置,其中 k
是非负数。
题目非常简单,分成两段数组分别赋值即可,不过注意是检查的依旧是原数组
1 2 3 4 5 6 7 8 9 10 11 12
| public void rotate(int[] nums, int k) { int[] temp = Arrays.copyOf(nums, nums.length); k = k % nums.length;
for (int i = 0; i < nums.length - k; i++) { nums[i + k] = temp[i]; } for (int i = nums.length - k; i < nums.length; i++) { nums[i - nums.length + k] = temp[i]; } }
|
空间复杂度优化
又是进行复杂度优化,好吧,挺困难的,想了半天憋了个这还写不出来233 >:
无所谓了,这里是用循环替代来进行替换(替换到最后会回到原位)
不过这里用最大公因数限制次数确实是没想到
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public void rotate(int[] nums, int k) { int n = nums.length; k = k % n; int gcd = gcd(k, n); for (int i = 0; i < gcd; i++) { int current = i; int t1 = nums[i]; do { int next = (current + k) % n; int t2 = nums[next]; nums[next] = t1; t1 = t2; current = next; } while (current != i); } }
public int gcd(int x, int y) { return y > 0 ? gcd(y, x % y) : x; }
|
不过还有个大神方法:数组反转
将全部数组反转,再分别反转前k个和后k个即可完成此效果(因为反转后即使只有部分再反转,其中的相对顺序保持不变,根据轮转的效果来看也确实是相对顺序不变,只是分了两块而已)(确实是想不到啊~~)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public void rotate5(int[] nums, int k) { int n = nums.length; k %= n; reverse(nums, 0, n - 1); reverse(nums, 0, k - 1); reverse(nums, k, n - 1); }
public void reverse(int[] nums, int i, int j) { while (i < j) { int temp = nums[i]; nums[i++] = nums[j]; nums[j--] = temp; } }
|