48. Rotate Image
Description of 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].length1 <= n <= 201000 <= matrix[i][j] <= 1000
Solution 1
Explanation
Code (Rust)
#![allow(unused)] fn main() { impl Solution { pub fn rotate(matrix: &mut Vec<Vec<i32>>) { Solution::transpose(matrix); Solution::y_reflection(matrix); } fn transpose(matrix: &mut Vec<Vec<i32>>) { let n = matrix.len(); for i in 0..n { for j in (i+1)..n { let temp = matrix[i][j]; matrix[i][j] = matrix[j][i]; matrix[j][i] = temp; } } } fn y_reflection(matrix: &mut Vec<Vec<i32>>) { let n = matrix.len(); for i in 0..n { for j in 0..(n/2) { let temp = matrix[i][j]; matrix[i][j] = matrix[i][n - 1 - j]; matrix[i][n - 1 - j] = temp; } } } } }
Solution 2
Explanation
We can rotate elements from exterior to interior by swapping area 1 and 2, swapping area 2 and 3, and area 3 and 4.
Code (Rust)
#![allow(unused)] fn main() { impl Solution { pub fn rotate(matrix: &mut Vec<Vec<i32>>) { let mut i = 0; let n = matrix.len(); while i < n / 2 { // swap 1 2 for j in i..=(n-i-2){ let temp = matrix[i][j]; matrix[i][j] = matrix[j][n - i - 1]; matrix[j][n - i - 1] = temp; } // swap 2 3 for j in i..=(n-i-2){ let temp = matrix[i][j]; matrix[i][j] = matrix[n - i - 1][n - 1 - j]; matrix[n - i - 1][n - 1 - j] = temp; } // swap 3 4 for j in i..=(n-i-2){ let temp = matrix[i][j]; matrix[i][j] = matrix[n - 1 - j][i]; matrix[n - 1 - j][i] = temp; } i+=1; } } } }
Further Discussion
This problem though seems very easy, is very important in daily life. If we have to allocate another 2d array for rotation, we have to spend more memory on photo editing.