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].length1 <= n <= 20-1000 <= matrix[i][j] <= 1000
Examples

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

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
- JavaScript
- Rust
/**
* @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()
}
}
pub fn rotate(matrix: &mut Vec<Vec<i32>>) {
let n = matrix.len();
for i in 0..n {
for j in i..n {
let temp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = temp;
}
}
for i in 0..n {
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.