给你一个数组,将数组中的元素向右轮转 k
个位置,其中 k
是非负数。
我的思路:借助双端队列,每次将数组末尾的元素插入到数组的头,总共循环k次即可
代码如下:
public void rotate(int[] nums, int k) { Deque<Integer> queue = new LinkedList<>(); for (int i = 0; i < nums.length; i++) { queue.addLast(nums[i]); } while (k > 0){ Integer num = queue.removeLast(); queue.addFirst(num); k--; } for (int i = 0; i < nums.length; i++) { nums[i] = queue.removeFirst(); } }
结果:
官方给出的思路:
我们可以先将所有元素翻转,这样尾部的k mod n 个元素就被移至数组头部,然后我们再翻转 [0,k mod n − 1] 区间的元素和[k mod n,n−1] 区间的元素即能得到最后的答案。
代码如下:
class Solution {
public void rotate(int[] nums, int k) {
k %= nums.length;
reverse(nums, 0, nums.length - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, nums.length - 1);
}
public void reverse(int[] nums, int start, int end) {
while (start < end) {
int temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
start += 1;
end -= 1;
}
}
}