Learn how to rotate a square a matrix by 90 degrees in clockwise and anti-clockwise direction.
A matrix is represented by multi-dimensional array.
Clockwise example
Input: 1 2 3 4 5 6 7 8 9 Output: 7 4 1 8 5 2 9 6 3
Implementation
This algorithm will work without using any constant space that is it will rotate the matrix in place.
To rotate a matrix we will follow the steps of how we would rotate a square plane.
There is N/2 squares or cycles in a matrix of size N. Process a square one at a time. Run a loop to traverse the matrix a cycle at a time, i.e loop from 0 to N/2 – 1.
Traverse half the size of the matrix and in each loop rotate the element by updating them in clock wise or anti-clockwise direction.
It is similar like rotating a gear lock in one direction, first rotate the first layer, then second layer and so on. If there are inner cycle then repeat the same for them.
Rotate a square matrix in clockwise direction

As you can see in the above image we rotate each square in the top cycle and then move to the inner cycle.
const rotateMatrixClockWise = (arr, N = arr.length) => {
for(let x = 0; x < N / 2; x++){
for(let y = x; y < N - x - 1; y++){
//Store the left value and start the rotation from here
let temp = arr[x][y];
// Move values from left to top
arr[x][y] = arr[N - 1 - y][x];
// Move values from top to right
arr[N - 1 - y][x] = arr[N - 1 - x][N - 1 - y];
// Move values from right to bottom
arr[N - 1 - x][N - 1 - y] = arr[y][N - 1 - x];
// Move values from bottom to left
arr[y][N - 1 - x] = temp;
}
}
return arr;
}
Input: const arr = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]; console.log(rotateMatrixClockWise(arr)); Output: [[13, 9, 5, 1], [14, 10, 6, 2], [15, 11, 7, 3], [16, 12, 8, 4]]
Time complexity: O(N ^ 2).
Space complexity: O(1).
Rotate a square matrix by 90 degrees in anti-clockwise direction

Same as we did for clockwise direction for anti-clock wise direction will rotate in opposite direction.
const rotateMatrixAntiClockWise = (arr, N = arr.length) => {
for(let x = 0; x < N / 2; x++){
for(let y = x; y < N - x - 1; y++){
//Store the right value and start the rotation from here
let temp = arr[x][y];
// Move values from right to top
arr[x][y] = arr[y][N - 1 - x];
// Move values from bottom to right
arr[y][N - 1 -x] = arr[N - 1 - x][N - 1 - y];
// Move values from left to bottom
arr[N - 1 - x][N - 1 - y] = arr[N - 1 -y][x];
// Assign temp to left
arr[N - 1 - y][x] = temp;
}
}
return arr;
}
Input: const arr = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]; console.log(rotateMatrixClockWise(arr)); Output: [[4, 8, 12, 16], [3, 7, 11, 15], [2, 6, 10, 14], [1, 5, 9, 13]]
Time complexity: O(N ^ 2).
Space complexity: O(1).