Rotate a Matrix List in Python


The challenge

You are given an n x n 2D matrix representing an image.

Rotate the image by 90 degrees (clockwise).

Note:

You have to rotate the image in-place, which means you have to modify the input 2D matrix directly. DO NOT allocate another 2D matrix and do the rotation.

Example 1:

Given input matrix = 
[
  [1,2,3],
  [4,5,6],
  [7,8,9]
],

rotate the input matrix in-place such that it becomes:
[
  [7,4,1],
  [8,5,2],
  [9,6,3]
]

Example 2:

Given input matrix =
[
  [ 5, 1, 9,11],
  [ 2, 4, 8,10],
  [13, 3, 6, 7],
  [15,14,12,16]
], 

rotate the input matrix in-place such that it becomes:
[
  [15,13, 2, 5],
  [14, 3, 4, 1],
  [12, 6, 8, 9],
  [16, 7,10,11]
]

The first solution

With this solution, we loop through each column and row and swap the elements, then finally we loop through each row one last time and reverse them.

def rotate(self, matrix: List[List[int]]) -> None:
    # Transpose the matrix
    for i in range(len(matrix)):
        for j in range(i, len(matrix)):
            matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]

    # Reverse each row
    for i in range(len(matrix)):
        matrix[i].reverse()

An alternative solution

With this solution, we start by reversing the list and then loop through each column and row. Within this second loop, we swap the elements.

def rotate(self, matrix: List[List[int]]) -> None:
    n = len(matrix)
    matrix.reverse()
    for x in range(n):
        for y in range(n-1, x-1, -1):
            matrix[x][y], matrix[y][x] = matrix[y][x], matrix[x][y]