Thinking process I - extra array
O(n) + O(k) space
public class Solution {
public void rotate(int[] nums, int k) {
if (nums.length == 0 || k == 0) return;
if (k > nums.length) k %= nums.length;
int[] shiftedElements = new int[k];
for (int i = 0; i < shiftedElements.length; ++i) {
shiftedElements[i] = nums[nums.length - i - 1];
}
for (int i = 0; i < nums.length - k; ++i) {
nums[nums.length - i - 1] = nums[nums.length - i - k - 1];
}
for (int i = 0; i < shiftedElements.length; ++i) {
nums[i] = shiftedElements[shiftedElements.length - i - 1];
}
}
}
Thinking process II - reversal
O(n) + 1 extra space
Mistakes
don't forget to check whether k is larger than input array' length
public class Solution {
public void rotate(int[] nums, int k) {
if (nums.length == 0 || k == 0) return;
if (k > nums.length) k %= nums.length;
reverse(nums, 0, nums.length - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, nums.length - 1);
}
private void reverse(int[] nums, int start, int end) {
while (start < end) {
int tmp = nums[start];
nums[start] = nums[end];
nums[end] = tmp;
start++;
end--;
}
}
}