Skip to main content

Rotate Image

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.

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

48-rotate

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

48-rotate

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],
]

Solution

The problem gives us an n x n matrix, which means it's a square matrix. The approach is to first transpose the matrix along the diagonal. Using example 1, swap 2 with 4, 3 with 7, and 6 with 8 to get the middle matrix shown below. Then reverse each row to get the final result.

1 2 3     Transpose     1 4 7     Reverse Rows     7 4 1
4 5 6 -------------> 2 5 8 -----------------> 8 5 2
7 8 9 3 6 9 9 6 3
/**
* @param {number[][]} matrix
* @return {void} Do not return anything, modify matrix in-place instead.
*/
var rotate = function (matrix) {
const n = matrix.length

for (let i = 0; i < n; i++) {
for (let j = i; j < n; j++) {
;[matrix[i][j], matrix[j][i]] = [matrix[j][i], matrix[i][j]]
}
}

for (let i = 0; i < n; i++) {
matrix[i].reverse()
}
}

Complexity Analysis

  • Time Complexity: O(n²) - We traverse the entire matrix twice: once for transposing and once for reversing each row.
  • Space Complexity: O(1) - We modify the matrix in-place without using any additional space.