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]]
Example 3:
Input: matrix = [[1]] Output: [[1]]
Example 4:
Input: matrix = [[1,2],[3,4]] Output: [[3,1],[4,2]]
Constraints:
matrix.length == n
matrix[i].length == n
1 <= n <= 20
-1000 <= matrix[i][j] <= 1000
旋转图像。
题意是给一个n x n的二维数组,请你将它顺时针九十度旋转。要求in-place做。
既然规定了要 in-place 做,只能想到对折之类的做法。但是如何对折呢?是先通过对角线对折(左上 - 右下),然后再上下对折。注意对角线对折部分 j 指针是从哪里开始的。
时间O(n^2)
空间O(1)
JavaScript实现
1 /** 2 * @param {number[][]} matrix 3 * @return {void} Do not return anything, modify matrix in-place instead. 4 */ 5 var rotate = function (matrix) { 6 let m = matrix.length; 7 // 左上- 右下对角线交换 8 for (let i = 0; i < m; i++) { 9 for (let j = i; j < m; j++) { 10 let temp = matrix[i][j]; 11 matrix[i][j] = matrix[j][i]; 12 matrix[j][i] = temp; 13 } 14 } 15 16 // 左右对折 17 for (let i = 0; i < m; i++) { 18 for (let j = 0; j < m / 2; j++) { 19 let temp = matrix[i][j]; 20 matrix[i][j] = matrix[i][m - 1 - j]; 21 matrix[i][m - 1 - j] = temp; 22 } 23 } 24 };
Java实现
1 class Solution { 2 public void rotate(int[][] matrix) { 3 // 按左上 - 右下对角线交换 4 int m = matrix.length; 5 for (int i = 0; i < m; i++) { 6 for (int j = i; j < m; j++) { 7 int temp = matrix[i][j]; 8 matrix[i][j] = matrix[j][i]; 9 matrix[j][i] = temp; 10 } 11 } 12 13 // 左右对折 14 for (int i = 0; i < m; i++) { 15 for (int j = 0; j < m / 2; j++) { 16 int temp = matrix[i][j]; 17 matrix[i][j] = matrix[i][m - 1 - j]; 18 matrix[i][m - 1 - j] = temp; 19 } 20 } 21 return; 22 } 23 }
相关题目