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:
- 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.
- 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.
- Reverse each row of the matrix
- 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++
#include <bits/stdc++.h>
using namespace std;
void print(vector<vector< int > > 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" ;
}
}
void rotate(vector<vector< int > > mat)
{
int N = mat.size();
int M = mat[0].size();
for ( int i = 0; i < min(N, M); i++) {
for ( int j = i; j < min(N, M); j++) {
swap(mat[i][j], mat[j][i]);
}
}
if (N > M) {
for ( int i = 0; i < M; i++) {
for ( int j = min(N, M); j < N; j++) {
mat[i].push_back(mat[j][i]);
}
}
}
else {
mat.resize(M, {});
for ( int i = min(N, M); i < M; i++) {
for ( int j = 0; j < N; j++) {
mat[i].push_back(mat[j][i]);
}
}
}
for ( int i = 0; i < M; i++) {
reverse(mat[i].begin(), mat[i].end());
}
print(mat, M, N);
}
int main()
{
vector<vector< int > > mat = { { 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 },
{ 10, 11, 12 } };
rotate(mat);
return 0;
}
|
Java
import java.io.*;
import java.util.*;
class GFG {
static void print(ArrayList<ArrayList<Integer>> mat, int N, int M)
{
for ( int i = 0 ; i < N; i++) {
for ( int j = 0 ; j < M; j++) {
System.out.print(mat.get(i).get(j) + " " );
}
System.out.println();
}
}
static void rotate(ArrayList<ArrayList<Integer>> mat)
{
int N = mat.size();
int M = mat.get( 0 ).size();
for ( int i = 0 ; i < Math.min(N, M); i++) {
for ( int j = i; j < Math.min(N, M); j++) {
int temp = mat.get(i).get(j);
mat.get(i).set(j,mat.get(j).get(i));
mat.get(j).set(i,temp);
}
}
if (N > M) {
for ( int i = 0 ; i < M; i++) {
for ( int j = Math.min(N, M); j < N; j++) {
mat.get(i).add(mat.get(j).get(i));
}
}
}
else {
mat = new ArrayList<>(M);
for ( int i= 0 ;i<M;i++){
mat.add(i , new ArrayList<>());
}
for ( int i = Math.min(N, M); i < M; i++) {
for ( int j = 0 ; j < N; j++) {
mat.get(i).add(mat.get(j).get(i));
}
}
}
for ( int i = 0 ; i < M; i++) {
Collections.reverse(mat.get(i));
}
print(mat, M, N);
}
public static void main(String args[])
{
ArrayList<ArrayList<Integer>> mat = new ArrayList<>();
mat.add( new ArrayList<Integer>(Arrays.asList( 1 , 2 , 3 )));
mat.add( new ArrayList<Integer>(Arrays.asList( 4 , 5 , 6 )));
mat.add( new ArrayList<Integer>(Arrays.asList( 7 , 8 , 9 )));
mat.add( new ArrayList<Integer>(Arrays.asList( 10 , 11 , 12 )));
rotate(mat);
}
}
|
Python3
def Print (mat, N, M):
for i in range (N):
for j in range (M):
print (mat[i][j] , end = " " )
print ()
def rotate(mat):
N = len (mat)
M = len (mat[ 0 ])
for i in range ( min (N, M)):
for j in range (i, min (N, M)):
mat[i][j], mat[j][i] = mat[j][i], mat[i][j]
if (N > M):
for i in range (M):
for j in range ( min (N, M),N):
mat[i].append(mat[j][i])
else :
mat = [[] for i in range (M)]
for i in range ( min (N, M),M):
for j in range (N):
mat[i].append(mat[j][i])
for i in range (M):
mat[i] = mat[i][:: - 1 ]
Print (mat, M, N)
mat = [ [ 1 , 2 , 3 ],
[ 4 , 5 , 6 ],
[ 7 , 8 , 9 ],
[ 10 , 11 , 12 ] ]
rotate(mat)
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static void print(List<List< int >> mat, int N, int M)
{
for ( int i = 0; i < N; i++) {
for ( int j = 0; j < M; j++) {
Console.Write(mat[i][j] + " " );
}
Console.WriteLine();
}
}
static void rotate(List<List< int >> mat)
{
int N = mat.Count;
int M = mat[0].Count;
for ( int i = 0; i < Math.Min(N, M); i++) {
for ( int j = i; j < Math.Min(N, M); j++) {
int temp = mat[i][j];
mat[i][j] =mat[j][i];
mat[j][i] = temp;
}
}
if (N > M) {
for ( int i = 0; i < M; i++) {
for ( int j = Math.Min(N, M); j < N; j++) {
mat[i].Add(mat[j][i]);
}
}
}
else {
mat = new List<List< int >>(M);
for ( int i=0;i<M;i++){
mat[i] = new List< int >();
}
for ( int i = Math.Min(N, M); i < M; i++) {
for ( int j = 0; j < N; j++) {
mat[i].Add(mat[j][i]);
}
}
}
for ( int i = 0; i < M; i++) {
mat[i].Reverse();
}
print(mat, M, N);
}
public static void Main()
{
List<List< int >> mat = new List<List< int >>();
mat.Add( new List< int >( new int [] {1, 2, 3}));
mat.Add( new List< int >( new int [] {4, 5, 6}));
mat.Add( new List< int >( new int [] {7, 8, 9}));
mat.Add( new List< int >( new int [] {10, 11, 12}));
rotate(mat);
}
}
|
Javascript
<script>
function print(mat,N,M)
{
for (let i = 0; i < N; i++) {
for (let j = 0; j < M; j++) {
document.write(mat[i][j] , " " );
}
document.write( "</br>" );
}
}
function rotate(mat)
{
let N = mat.length;
let M = mat[0].length;
for (let i = 0; i < Math.min(N, M); i++) {
for (let j = i; j < Math.min(N, M); j++) {
let temp = mat[i][j];
mat[i][j] = mat[j][i];
mat[j][i] = temp;
}
}
if (N > M) {
for (let i = 0; i < M; i++) {
for (let j = Math.min(N, M); j < N; j++) {
mat[i].push(mat[j][i]);
}
}
}
else {
mat = new Array(M).fill(0).map(()=>[])
for (let i = Math.min(N, M); i < M; i++) {
for (let j = 0; j < N; j++) {
mat[i].push(mat[j][i]);
}
}
}
for (let i = 0; i < M; i++) {
mat[i] = mat[i].reverse();
}
print(mat, M, N);
}
let mat = [ [ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ],
[ 10, 11, 12 ] ];
rotate(mat);
</script>
|
Output
10 7 4 1
11 8 5 2
12 9 6 3
Time Complexity: O(N * M) Auxiliary Space: O(1)
|