In a straightforward way, we can create a new array and then copy elements to the new array. Then change the original array by using System.arraycopy(). Space is O(n) and Time is O(n).
Solution 2 - Bubble Rotate Can we do this in O(1) space? This solution is like a bubble sort Space is O(1) and Time is O(n*k).
Solution 3 Reversal Can we do this in O(1) space and in O(n) time? The following solution does. Assuming we are given {1,2,3,4,5,6} and order 2. The basic idea is:
public static void rotate(int[] arr, int order) {
if (arr == null || order < 0) {
throw new IllegalArgumentException("Illegal argument!");
}
for (int i = 0; i < order; i++) {
for (int j = arr.length - 1; j > 0; j--) {
int temp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = temp;
}
}
}
1. Divide the array two parts: 1,2,3,4 and 5, 6
2. Reverse first part: 4,3,2,1,5,6
3. Reverse second part: 4,3,2,1,6,5
4. Reverse the whole array: 5,6,1,2,3,4
public static void rotate(int[] arr, int order) {
if (arr == null || arr.length==0 || order < 0) {
throw new IllegalArgumentException("Illegal argument!");
return;
}
if(order > arr.length){
order = order %arr.length;
}
//length of first part
int a = arr.length - order;
reverse(arr, 0, a-1);
reverse(arr, a, arr.length-1);
reverse(arr, 0, arr.length-1);
}
public static void reverse(int[] arr, int left, int right){
if(arr == null || arr.length == 1)
return;
while(left < right){
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
left++;
right--;
}
}