LeetCode链接:189. 轮转数组 - 力扣(LeetCode)
思路一:使用循环链表,将元素依次放入链表,并从n-k的位置顺序输出n个元素到新数组
java代码:
//使用链表
class Solution {
public void rotate(int[] nums, int k) {
int n = nums.length;
if(n < 2) return;
k = k % n;
Node head = new Node(nums[0]);
Node curr = head;
for(int i = 1; i < n; i++){
curr.next = new Node(nums[i]);
curr = curr.next;
}
curr.next = head;
int moves = n - k + 1;
while(moves > 0){
curr = curr.next;
moves--;
}
for(int i = 0; i < n; i++){
nums[i] = curr.val;
curr.next;
}
}
}
class Node{
int val;
Node next;
public Node(int v){
this.val = val;
this.next = null;
}
}
思路二:翻转数组,第一次翻转[0,length-1],第二次翻转[0,k-1],第三次翻转[k,length-1]
java代码:
//翻转数组
class Solution {
public void rotate(int[] nums, int k) {
int length = nums.length;
if(length < 2 || k % length == 0) return;
k = k % length;
reverse(nums,0,length - 1);
reverse(nums,0,k - 1);
reverse(nums,k,length - 1);
}
public void reverse(int[] nums, int i, int j){
int temp;
while(i <= j){
temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
i++;
j--;
}
}
}
思路三:使用额外数组,将原数组 i 索引位置的元素赋值给新数组的(i + k) % n的位置
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);
}
}