Inplace rotate square matrix by 90 degrees | Set 1

30 Jun, 2022
Given a square matrix, turn it by 90 degrees in anti-clockwise direction without using any extra space.
Examples : 
Input:
Matrix:
 1  2  3
 4  5  6
 7  8  9
Output:
 3  6  9 
 2  5  8 
 1  4  7 
The given matrix is rotated by 90 degree 
in anti-clockwise direction.

Input:
 1  2  3  4 
 5  6  7  8 
 9 10 11 12 
13 14 15 16 
Output:
 4  8 12 16 
 3  7 11 15 
 2  6 10 14 
 1  5  9 13
The given matrix is rotated by 90 degree 
in anti-clockwise direction.
An approach that requires extra space is already discussed here.
Approach: To solve the question without any extra space, rotate the array in form of squares, dividing the matrix into squares or cycles. For example, A 4 X 4 matrix will have 2 cycles. The first cycle is formed by its 1st row, last column, last row and 1st column. The second cycle is formed by 2nd row, second-last column, second-last row and 2nd column. The idea is for each square cycle, swap the elements involved with the corresponding cell in the matrix in anti-clockwise direction i.e. from top to left, left to bottom, bottom to right and from right to top one at a time using nothing but a temporary variable to achieve this.
Demonstration: 
First Cycle (Involves Red Elements)
 1  2  3 4 
 5  6  7 8 
 9 10 11 12 
 13 14 15 16 

Moving first group of four elements (First
elements of 1st row, last row, 1st column 
and last column) of first cycle in counter
clockwise. 
 4  2  3 16
 5  6  7 8 
 9 10 11 12 
 1 14  15 13 
 
Moving next group of four elements of 
first cycle in counter clockwise 
 4  8  3 16 
 5  6  7  15  
 2  10 11 12 
 1  14  9 13 

Moving final group of four elements of 
first cycle in counter clockwise 
 4  8 12 16 
 3  6  7 15 
 2 10 11 14 
 1  5  9 13 


Second Cycle (Involves Blue Elements)
 4  8 12 16 
 3  6 7  15 
 2  10 11 14 
 1  5  9 13 

Fixing second cycle
 4  8 12 16 
 3  7 11 15 
 2  6 10 14 
 1  5  9 13
Algorithm: 
There is N/2 squares or cycles in a matrix of side 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, loop counter is iConsider elements in group of 4 in current square, rotate the 4 elements at a time. So the number of such groups in a cycle is N – 2*i.So run a loop in each cycle from x to N – x – 1, loop counter is yThe elements in the current group is (x, y), (y, N-1-x), (N-1-x, N-1-y), (N-1-y, x), now rotate the these 4 elements, i.e (x, y) <- (y, N-1-x), (y, N-1-x)<- (N-1-x, N-1-y), (N-1-x, N-1-y)<- (N-1-y, x), (N-1-y, x)<- (x, y)Print the matrix.
There is N/2 squares or cycles in a matrix of side 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, loop counter is i
Consider elements in group of 4 in current square, rotate the 4 elements at a time. So the number of such groups in a cycle is N – 2*i.
So run a loop in each cycle from x to N – x – 1, loop counter is y
The elements in the current group is (x, y), (y, N-1-x), (N-1-x, N-1-y), (N-1-y, x), now rotate the these 4 elements, i.e (x, y) <- (y, N-1-x), (y, N-1-x)<- (N-1-x, N-1-y), (N-1-x, N-1-y)<- (N-1-y, x), (N-1-y, x)<- (x, y)
Print the matrix.
Implementation:
C++
Java
Python3
C#
PHP
Javascript
// C++ program to rotate a matrix// by 90 degrees#include <bits/stdc++.h>#define N 4using namespace std; // An Inplace function to// rotate a N x N matrix// by 90 degrees in// anti-clockwise directionvoid rotateMatrix(int mat[][N]){    // Consider all squares one by one    for (int x = 0; x < N / 2; x++) {        // Consider elements in group        // of 4 in current square        for (int y = x; y < N - x - 1; y++) {            // Store current cell in            // temp variable            int temp = mat[x][y];             // Move values from right to top            mat[x][y] = mat[y][N - 1 - x];             // Move values from bottom to right            mat[y][N - 1 - x] = mat[N - 1 - x][N - 1 - y];             // Move values from left to bottom            mat[N - 1 - x][N - 1 - y] = mat[N - 1 - y][x];             // Assign temp to left            mat[N - 1 - y][x] = temp;        }    }} // Function to print the matrixvoid displayMatrix(int mat[N][N]){    for (int i = 0; i < N; i++)    {        for (int j = 0; j < N; j++)        {            cout<<mat[i][j]<<" ";        }        cout<<endl;    }    cout<<endl;} /* Driver program to test above functions */int main(){    // Test Case 1    int mat[N][N] = { { 1, 2, 3, 4 },                      { 5, 6, 7, 8 },                      { 9, 10, 11, 12 },                      { 13, 14, 15, 16 } };     // Test Case 2    /* int mat[N][N] = {                        {1, 2, 3},                        {4, 5, 6},                        {7, 8, 9}                    };     */     // Test Case 3    /*int mat[N][N] = {                    {1, 2},                    {4, 5}                };*/     // displayMatrix(mat);     rotateMatrix(mat);     // Print rotated matrix    displayMatrix(mat);     return 0;}
// Java program to rotate a// matrix by 90 degreesimport java.io.*; class GFG {    // An Inplace function to    // rotate a N x N matrix    // by 90 degrees in    // anti-clockwise direction    static void rotateMatrix(int N, int mat[][])    {        // Consider all squares one by one        for (int x = 0; x < N / 2; x++) {            // Consider elements in group            // of 4 in current square            for (int y = x; y < N - x - 1; y++) {                // Store current cell in                // temp variable                int temp = mat[x][y];                 // Move values from right to top                mat[x][y] = mat[y][N - 1 - x];                 // Move values from bottom to right                mat[y][N - 1 - x]                    = mat[N - 1 - x][N - 1 - y];                 // Move values from left to bottom                mat[N - 1 - x][N - 1 - y]                    = mat[N - 1 - y][x];                 // Assign temp to left                mat[N - 1 - y][x] = temp;            }        }    }     // Function to print the matrix    static void displayMatrix(int N, int mat[][])    {        for (int i = 0; i < N; i++) {            for (int j = 0; j < N; j++)                System.out.print(" " + mat[i][j]);             System.out.print("\n");        }        System.out.print("\n");    }     /* Driver program to test above functions */    public static void main(String[] args)    {        int N = 4;         // Test Case 1        int mat[][] = { { 1, 2, 3, 4 },                        { 5, 6, 7, 8 },                        { 9, 10, 11, 12 },                        { 13, 14, 15, 16 } };         // Test Case 2        /* int mat[][] = {                            {1, 2, 3},                            {4, 5, 6},                            {7, 8, 9}                        };         */         // Test Case 3        /*int mat[][] = {                        {1, 2},                        {4, 5}                    };*/         // displayMatrix(mat);         rotateMatrix(N, mat);         // Print rotated matrix        displayMatrix(N, mat);    }} // This code is contributed by Prakriti Gupta
# Python3 program to rotate a matrix by 90 degreesN = 4 # An Inplace function to rotate# N x N matrix by 90 degrees in# anti-clockwise direction  def rotateMatrix(mat):     # Consider all squares one by one    for x in range(0, int(N / 2)):         # Consider elements in group        # of 4 in current square        for y in range(x, N-x-1):             # store current cell in temp variable            temp = mat[x][y]             # move values from right to top            mat[x][y] = mat[y][N-1-x]             # move values from bottom to right            mat[y][N-1-x] = mat[N-1-x][N-1-y]             # move values from left to bottom            mat[N-1-x][N-1-y] = mat[N-1-y][x]             # assign temp to left            mat[N-1-y][x] = temp  # Function to print the matrixdef displayMatrix(mat):     for i in range(0, N):         for j in range(0, N):             print(mat[i][j], end=' ')        print("")  # Driver Codemat = [[0 for x in range(N)] for y in range(N)] # Test case 1mat = [[1, 2, 3, 4],       [5, 6, 7, 8],       [9, 10, 11, 12],       [13, 14, 15, 16]] '''# Test case 2mat = [ [1, 2, 3 ],        [4, 5, 6 ],        [7, 8, 9 ] ] # Test case 3mat = [ [1, 2 ],        [4, 5 ] ]         ''' rotateMatrix(mat) # Print rotated matrixdisplayMatrix(mat)  # This code is contributed by saloni1297
// C# program to rotate a// matrix by 90 degreesusing System; class GFG {    // An Inplace function to    // rotate a N x N matrix    // by 90 degrees in anti-    // clockwise direction    static void rotateMatrix(int N, int[, ] mat)    {        // Consider all        // squares one by one        for (int x = 0; x < N / 2; x++) {            // Consider elements            // in group of 4 in            // current square            for (int y = x; y < N - x - 1; y++) {                // store current cell                // in temp variable                int temp = mat[x, y];                 // move values from                // right to top                mat[x, y] = mat[y, N - 1 - x];                 // move values from                // bottom to right                mat[y, N - 1 - x]                    = mat[N - 1 - x, N - 1 - y];                 // move values from                // left to bottom                mat[N - 1 - x, N - 1 - y]                    = mat[N - 1 - y, x];                 // assign temp to left                mat[N - 1 - y, x] = temp;            }        }    }     // Function to print the matrix    static void displayMatrix(int N, int[, ] mat)    {        for (int i = 0; i < N; i++) {            for (int j = 0; j < N; j++)                Console.Write(" " + mat[i, j]);            Console.WriteLine();        }        Console.WriteLine();    }     // Driver Code    static public void Main()    {        int N = 4;         // Test Case 1        int[, ] mat = { { 1, 2, 3, 4 },                        { 5, 6, 7, 8 },                        { 9, 10, 11, 12 },                        { 13, 14, 15, 16 } };         // Test Case 2        /* int mat[][] =        {            {1, 2, 3},            {4, 5, 6},            {7, 8, 9}        };        */         // Test Case 3        /*int mat[][] =        {            {1, 2},            {4, 5}        };*/         // displayMatrix(mat);         rotateMatrix(N, mat);         // Print rotated matrix        displayMatrix(N, mat);    }} // This code is contributed by ajit
<?php// PHP program to rotate a// matrix by 90 degrees$N = 4; // An Inplace function to// rotate a N x N matrix// by 90 degrees in// anti-clockwise directionfunction rotateMatrix(&$mat){    global $N;         // Consider all    // squares one by one    for ($x = 0; $x < $N / 2; $x++)    {        // Consider elements        // in group of 4 in        // current square        for ($y = $x;             $y < $N - $x - 1; $y++)        {            // store current cell            // in temp variable            $temp = $mat[$x][$y];             // move values from            // right to top            $mat[$x][$y] = $mat[$y][$N - 1 - $x];             // move values from            // bottom to right            $mat[$y][$N - 1 - $x] =                $mat[$N - 1 - $x][$N - 1 - $y];             // move values from            // left to bottom            $mat[$N - 1 - $x][$N - 1 - $y] =                         $mat[$N - 1 - $y][$x];             // assign temp to left            $mat[$N - 1 - $y][$x] = $temp;        }    }} // Function to// print the matrixfunction displayMatrix(&$mat){    global $N;    for ($i = 0; $i < $N; $i++)    {        for ($j = 0; $j < $N; $j++)            echo $mat[$i][$j] . " ";         echo "\n";    }    echo "\n";} // Driver code // Test Case 1$mat =  array(array(1, 2, 3, 4),              array(5, 6, 7, 8),              array(9, 10, 11, 12),              array(13, 14, 15, 16)); // Test Case 2/* $mat = array(array(1, 2, 3),                array(4, 5, 6),                array(7, 8, 9));*/ // Test Case 3/*$mat = array(array(1, 2),               array(4, 5));*/ // displayMatrix($mat);rotateMatrix($mat); // Print rotated matrixdisplayMatrix($mat); // This code is contributed// by ChitraNayal?>
<script>// Javascript program to rotate a// matrix by 90 degrees     // An Inplace function to    // rotate a N x N matrix    // by 90 degrees in    // anti-clockwise direction    function rotateMatrix(N,mat)    {             // Consider all squares one by one        for (let x = 0; x < N / 2; x++)        {                     // Consider elements in group            // of 4 in current square            for (let y = x; y < N - x - 1; y++)            {                             // Store current cell in                // temp variable                let temp = mat[x][y];                   // Move values from right to top                mat[x][y] = mat[y][N - 1 - x];                   // Move values from bottom to right                mat[y][N - 1 - x]                    = mat[N - 1 - x][N - 1 - y];                   // Move values from left to bottom                mat[N - 1 - x][N - 1 - y] = mat[N - 1 - y][x];                   // Assign temp to left                mat[N - 1 - y][x] = temp;            }        }    }         // Function to print the matrix    function displayMatrix(N,mat)    {        for (let i = 0; i < N; i++)        {            for (let j = 0; j < N; j++)                document.write(                    " " + mat[i][j]);               document.write("<br>");        }        document.write("<br>");    }         /* Driver program to test above functions */    let N = 4;    let mat=[[1, 2, 3, 4],[ 5, 6, 7, 8 ],[9, 10, 11, 12 ],[13, 14, 15, 16]];         // displayMatrix(mat);    rotateMatrix(N, mat);     // Print rotated matrix    displayMatrix(N, mat);         // This code is contributed by rag2127. </script>
4 8 12 16 
3 7 11 15 
2 6 10 14 
1 5 9 13 
Complexity Analysis: 
Time Complexity: O(n2), where n is side of array. A single traversal of the matrix is needed.
Space Complexity: O(1). As a constant space is needed
 Easy  to understand and apply
Another Approach:
Reverse every individual  rowPerform Transpose
Reverse every individual  row
Perform Transpose
Implementation:
C++
Java
Python3
C#
Javascript
// C++ program to rotate a matrix// by 90 degrees#include <bits/stdc++.h>#define N 4using namespace std; // An Inplace function to// rotate a N x N matrix// by 90 degrees in// anti-clockwise directionvoid rotateMatrix(int mat[][N]){ // REVERSE every row    for (int i = 0; i < N; i++)        reverse(mat[i], mat[i] + N);     // Performing Transpose    for (int i = 0; i < N; i++) {        for (int j = i; j < N; j++)            swap(mat[i][j], mat[j][i]);    }} // Function to print the matrixvoid displayMatrix(int mat[N][N]){    for (int i = 0; i < N; i++) {        for (int j = 0; j < N; j++) {            cout << mat[i][j] << " ";        }        cout << endl;    }    cout << endl;} /* Driver program to test above functions */int main(){    // Test Case 1    int mat[N][N] = { { 1, 2, 3, 4 },                      { 5, 6, 7, 8 },                      { 9, 10, 11, 12 },                      { 13, 14, 15, 16 } };     // Test Case 2    /* int mat[N][N] = {                        {1, 2, 3},                        {4, 5, 6},                        {7, 8, 9}                    };     */     // Test Case 3    /*int mat[N][N] = {                    {1, 2},                    {4, 5}                };*/     // displayMatrix(mat);     rotateMatrix(mat);     // Print rotated matrix    displayMatrix(mat);     return 0;}
// Java program to rotate a// matrix by 90 degreesimport java.io.*; class GFG {   // Function to reverse  // the given 2D arr[][]  static void Reverse(int i,int mat[][], int N)  {    // Initialise start and end index    int start = 0;    int end = N - 1;     // Till start < end, swap the element    // at start and end index    while (start < end) {       // Swap the element      int temp = mat[i][start];      mat[i][start] = mat[i][end];      mat[i][end] = temp;       // Increment start and decrement      // end for next pair of swapping      start++;      end--;    }  }   // An Inplace function to  // rotate a N x N matrix  // by 90 degrees in  // anti-clockwise direction   static void rotateMatrix(int N, int mat[][])  { // REVERSE every row    for (int i = 0; i < N; i++)      Reverse(i,mat,N);     // Performing Transpose    for (int i = 0; i < N; i++) {      for (int j = i; j < N; j++)      {        int temp=mat[i][j];        mat[i][j]=mat[j][i];        mat[j][i]=temp;      }    }  }   // Function to print the matrix  static void displayMatrix(int N, int mat[][])  {    for (int i = 0; i < N; i++) {      for (int j = 0; j < N; j++)        System.out.print(" " + mat[i][j]);       System.out.print("\n");    }    System.out.print("\n");  }   /* Driver program to test above functions */  public static void main(String[] args)  {    int N = 4;     // Test Case 1    int mat[][] = { { 1, 2, 3, 4 },                   { 5, 6, 7, 8 },                   { 9, 10, 11, 12 },                   { 13, 14, 15, 16 } };     rotateMatrix(N, mat);     // Print rotated matrix    displayMatrix(N, mat);  }} // This code is contributed by Aarti_Rathi
# Python program to rotate# a matrix by 90 degrees  def rotateMatrix(mat):     # reversing the matrix    for i in range(len(mat)):        mat[i].reverse()     # make transpose of the matrix    for i in range(len(mat)):        for j in range(i, len(mat)):             # swapping mat[i][j] and mat[j][i]            mat[i][j], mat[j][i] = mat[j][i], mat[i][j]  # Function to print the matrixdef displayMatrix(mat):     for i in range(0, len(mat)):        for j in range(0, len(mat)):            print(mat[i][j], end=' ')        print()  mat = [[1, 2, 3, 4],       [5, 6, 7, 8],       [9, 10, 11, 12],       [13, 14, 15, 16]] rotateMatrix(mat) # Print rotated matrixdisplayMatrix(mat) # This code is contributed by shivambhagat02(CC).
// C# program to rotate a// matrix by 90 degreesusing System;  class GFG {    // Reverse each row of matrix    static void reverse(int N, int[, ] mat)    {        // Traverse each row of [,]mat        for (int i = 0; i < N; i++) {                    // Initialise start and end index            int start = 0;            int end = N - 1;                    // Till start < end, swap the element            // at start and end index            while (start < end) {                        // Swap the element                int temp = mat[i,start];                mat[i, start] = mat[i, end];                mat[i, end] = temp;                        // Increment start and decrement                // end for next pair of swapping                start++;                end--;            }               }    }    // An Inplace function to    // rotate a N x N matrix    // by 90 degrees in anti-    // clockwise direction    static void rotateMatrix(int N, int[, ] mat)    {        reverse(N, mat);                     // Performing Transpose        for(int i=0;i<N;i++)        {            for(int j=i;j<N;j++)            {                int temp = mat[i,j];                mat[i, j] = mat[j, i];                mat[j, i] = temp;            }        }             }      // Function to print the matrix    static void displayMatrix(int N, int[, ] mat)    {        for (int i = 0; i < N; i++) {            for (int j = 0; j < N; j++)                Console.Write(mat[i, j] + " ");            Console.Write("\n");        }    }      // Driver Code    static public void Main()    {        int N = 4;          // Test Case 1        int[, ] mat = { { 1, 2, 3, 4 },                        { 5, 6, 7, 8 },                        { 9, 10, 11, 12 },                        { 13, 14, 15, 16 } };          // Test Case 2        /* int mat[][] =        {            {1, 2, 3},            {4, 5, 6},            {7, 8, 9}        };        */          // Test Case 3        /*int mat[][] =        {            {1, 2},            {4, 5}        };*/          // displayMatrix(mat);          rotateMatrix(N, mat);          // Print rotated matrix        displayMatrix(N, mat);    }}  // This code is contributed by Aarti_Rathi
<script> // JavaScript program to rotate// a matrix by 90 degreesfunction rotateMatrix(mat){     // reversing the matrix    for(let i = 0; i < mat.length; i++){        mat[i].reverse()    }         // make transpose of the matrix    for(let i = 0; i < mat.length; i++){        for(let j = i; j < mat.length; j++){             // swapping mat[i][j] and mat[j][i]            let temp = mat[i][j]            mat[i][j] = mat[j][i]            mat[j][i] = temp        }    }} // Function to print the matrixfunction displayMatrix(mat){     for(let i = 0; i < mat.length; i++){        for(let j = 0; j < mat.length; j++){            document.write(mat[i][j],' ')        }        document.write("</br>")    }}  let mat = [[1, 2, 3, 4],    [5, 6, 7, 8],    [9, 10, 11, 12],    [13, 14, 15, 16]] rotateMatrix(mat) // Print rotated matrixdisplayMatrix(mat) // This code is contributed by shinjanpatra </script>
4 8 12 16 
3 7 11 15 
2 6 10 14 
1 5 9 13 
Complexity Analysis:  
Time Complexity: O(n2) + O(n2)   where n is size of array.
Auxiliary Space: O(1). As a constant space is needed
Exercise: Turn 2D matrix by 90 degrees in clockwise direction without using extra space.Rotate a matrix by 90 degree without using any extra space | Set 2
This article is contributed by Aditya Goel. If you like GeeksforGeeks and would like to contribute, you can also write an article and mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks. 
jit_t
ukasp
Akanksha_Rai
andrew1234
rag2127
anushikasethh
rajeev0719singh
code_hunt
shivampkrr
surinderdawra388
shinjanpatra
dhruvkejri9
_shinchancode
codewithshinchan
hardikkoriintern
Amazon
Facebook
Google
Microsoft
Morgan Stanley
rotation
Zoho
Arrays
Matrix
Zoho
Morgan Stanley
Amazon
Microsoft
Google
Facebook
Arrays
Matrix
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Arrays in Java
Write a program to reverse an array or string
Maximum and minimum of an array using minimum number of comparisons
Top 50 Array Coding Problems for Interviews
Largest Sum Contiguous Subarray
Matrix Chain Multiplication | DP-8
Program to find largest element in an array
Rat in a Maze | Backtracking-2
Sudoku | Backtracking-7
Find the number of islands | Set 1 (Using DFS)