View on NeetCode
View on LeetCode

Problem

You are given an n x n 2D matrix representing an image, rotate the image by 90 degrees (clockwise).

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:

Input: matrix = [[1,2,3],[4,5,6],[7,8,9]]
Output: [[7,4,1],[8,5,2],[9,6,3]]

Example 2:

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

Constraints:

  • n == matrix.length == matrix[i].length
  • 1 <= n <= 20
  • -1000 <= matrix[i][j] <= 1000

Solution

Approach 1: Transpose + Reverse

The key insight is that a 90-degree clockwise rotation can be achieved by:

  1. Transposing the matrix (swap rows and columns)
  2. Reversing each row

Implementation

class Solution:
    def rotate(self, matrix: List[List[int]]) -> None:
        """
        Do not return anything, modify matrix in-place instead.
        """
        n = len(matrix)

        # Transpose matrix
        for i in range(n):
            for j in range(i + 1, n):
                matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]

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

Approach 2: Layer by Layer Rotation

class Solution:
    def rotate(self, matrix: List[List[int]]) -> None:
        n = len(matrix)

        # Process each layer
        for layer in range(n // 2):
            first = layer
            last = n - 1 - layer

            for i in range(first, last):
                offset = i - first

                # Save top
                top = matrix[first][i]

                # left -> top
                matrix[first][i] = matrix[last - offset][first]

                # bottom -> left
                matrix[last - offset][first] = matrix[last][last - offset]

                # right -> bottom
                matrix[last][last - offset] = matrix[i][last]

                # top -> right
                matrix[i][last] = top

Approach 3: Four-way Swap

class Solution:
    def rotate(self, matrix: List[List[int]]) -> None:
        n = len(matrix)

        for i in range(n // 2):
            for j in range(i, n - i - 1):
                # Four-way swap
                temp = matrix[i][j]
                matrix[i][j] = matrix[n - 1 - j][i]
                matrix[n - 1 - j][i] = matrix[n - 1 - i][n - 1 - j]
                matrix[n - 1 - i][n - 1 - j] = matrix[j][n - 1 - i]
                matrix[j][n - 1 - i] = temp

Complexity Analysis

Transpose + Reverse:

  • Time Complexity: O(n²), where n is the dimension of the matrix. We visit each cell once.
  • Space Complexity: O(1), in-place rotation.

Layer by Layer:

  • Time Complexity: O(n²), process each element once.
  • Space Complexity: O(1), in-place rotation.

Key Insights

  1. Transformation Decomposition: A 90° clockwise rotation equals transpose + reverse rows.

  2. Mathematical Mapping: Element at (i, j) moves to (j, n-1-i) in a clockwise rotation.

  3. In-Place Requirement: We must swap elements rather than creating a new matrix.

  4. Layer Processing: For layer-by-layer approach, process outer layers first, moving inward.

  5. Four Elements at Once: Each rotation operation can swap 4 elements simultaneously.

  6. Edge Cases: Handle both odd and even dimensions correctly (center element stays in place for odd n).

  7. Alternative Rotations: For counter-clockwise, reverse rows then transpose (or transpose then reverse columns).