Rotate a matrix clockwise by 90 degree without using any extra space | Set 3

• Difficulty Level : Medium
• Last Updated : 09 Jul, 2021

Given a rectangular matrix mat[][] with N rows and M columns, the task is to rotate the matrix by 90 degrees in a clockwise direction without using extra space.

Examples:

Input: mat[][] = {{1, 2, 3},  {4, 5, 6},   {7, 8, 9},  {10, 11, 12}}
Output: 10 7 4 1
11 8 5 2
12 9 6 3

Input: mat[][] = {{1, 2, 3, 4, 5, 6}, {7, 8, 9, 10, 11, 12}}
Output: 7 1
8 2
9 3
10 4
11 5
12 6

Note: The approach to rotate square matrix is already discussed as follows:

Approach: The main idea is to perform an in-place rotation.

Follow the below steps to solve the given problem:

1. Swap all the elements of the sub-matrix min(N, M) * min(N, M), along the main diagonal i.e from the upper top corner to the bottom right corner.
2. If N is greater than M,
• Push all the unswapped elements of each column i where (min(N, M) ≤ i) to the ith row.
• Otherwise, push all the unswapped elements of each row i where (min(N, M) ≤ i) to the ith column.
3. Reverse each row of the matrix
4. Print the updated matrix of dimension M × N.

Procedure:

Let the given matrix be :
1 2 3
4 5 6
7 8 9
10 11 12
13 14 15
Swap all the elements of the sub-matrix min(N, M) * min(N, M) i.e 3 * 3 for this example
1 4 7
2 5 8
3 6 9
10 11 12
13 14 15

Since N > M, push all the unswapped elements of each column i (min(N, M) ≤ i) to the ith row
1 4 7 10 13
2 5 8 11 14
3 6 9 12 15

Reverse each column to get the final rotated matrix as:
13 10 7 4 1
14 11 8 5 2
15 12 9 6 3

Below is the implementation of the above approach:

C++

 // C++ program for // the above approach #include using namespace std;    // Function to print the matrix mat // with N rows and M columns void print(vector > mat,            int N, int M) {     for (int i = 0; i < N; i++) {         for (int j = 0; j < M; j++) {             cout << mat[i][j] << " ";         }            cout << "\n";     } }    // Function to rotate the matrix // by 90 degree clockwise void rotate(vector > mat) {     // Number of rows     int N = mat.size();        // Number of columns     int M = mat.size();        // Swap all the elements along main diagonal     // in the submatrix min(N, M) * min(N, M)     for (int i = 0; i < min(N, M); i++) {         for (int j = i; j < min(N, M); j++) {                // Swap mat[i][j] and mat[j][i]             swap(mat[i][j], mat[j][i]);         }     }        // If N is greater than M     if (N > M) {            // Push all the unswapped elements         // of ith column to ith row         for (int i = 0; i < M; i++) {             for (int j = min(N, M); j < N; j++) {                 mat[i].push_back(mat[j][i]);             }         }     }     else {         // Resize mat to have M rows         mat.resize(M, {});            // Push all the unswapped elements         // of ith column to ith row         for (int i = min(N, M); i < M; i++) {             for (int j = 0; j < N; j++) {                 mat[i].push_back(mat[j][i]);             }         }     }        // Reverse each row of the matrix     for (int i = 0; i < M; i++) {         reverse(mat[i].begin(), mat[i].end());     }        // Print the final matrix     print(mat, M, N); }    // Driver Code int main() {     // Input     vector > mat = { { 1, 2, 3 },                                  { 4, 5, 6 },                                  { 7, 8, 9 },                                  { 10, 11, 12 } };        // Function Call     rotate(mat);        return 0; }

Output

10 7 4 1
11 8 5 2
12 9 6 3

Time Complexity: O(N * M)
Auxiliary Space: O(1)

My Personal Notes arrow_drop_up
Recommended Articles
Page :