Given an integer array nums, rotate the array to the right by k steps, where k is non-negative.
현재 인덱스 값을 k 이전 인덱스의 값으로 재귀적으로 변경한다.
방문한 인덱스는 기록한다.
class Solution {
int[] nums;
int k;
boolean[] visit = new boolean[100000];
public void rotate(int[] nums, int k) {
this.nums = nums;
this.k = k;
IntStream.range(0, nums.length)
.forEach(this::rec);
}
private int rec(int idx) {
if (visit[idx]) {
return nums[idx];
}
visit[idx] = true;
int num = nums[idx];
nums[idx] = rec(index(idx));
return num;
}
private int index(int idx){
int index = idx - k;
while (index < 0) {
index += nums.length;
}
return index;
}
}
class Solution {
int[] nums = null;
int k = 0;
public void rotate(int[] nums, int k) {
this.nums = nums;
this.k = k;
next(0);
}
private void next(int n){
if(n >= nums.length)
return;
int num = nums[n];
next(n + 1);
nums[nextNum(n)] = num;
}
private int nextNum(int n){
return (n + k) % nums.length;
}
}
nums: 1 2 3 4 5 6 7
k: 3
reverse1: 7 6 5 4 3 2 1
reverse2: 5 6 7 4 3 2 1
reverse3: 5 6 7 1 2 3 4
모든 숫자가 +3 만큼 이동하였다.
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++;
end--;
}
}