48.旋转图像
标签:数组、数学、矩阵
难度:中等
描述:给定一个 n×n 大小的二维矩阵(代表图像)matrix。
要求:将二维矩阵 matrix 顺时针旋转 90°。
说明:
不能使用额外的数组空间。
n==matrix.length==matrix[i].length。
1≤n≤20。
−1000≤ matrix[i][j] ≤1000。
示例:
示例1
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[7,4,1],[8,5,2],[9,6,3]]
示例2
输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
输出:[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]
思路
以示例2为例,经过观察,矩阵的第1行旋转90度变成了倒数第1列,第2行旋转90度变为倒数第2列。所以,可以得出一般性结论:位置第 i 行、第 j 列的元素经过90度旋转,到了第 j 行、第 n - i - 1 列的位置上。
即 matrix[j][n - i - 1] = matrix[i][j].
原先第 j 行、第 n - i - 1 列的位置的元素经过旋转也移动到新位置上,带入一般性结论得出:
matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1]. 即原先第 j 行、第 n - i - 1 列的元素旋转后到了第 n - i - 1 行、第 n - j - 1 列的位置上。
类似地,原先(n - i - 1, n - j - 1)位置上元素旋转后,存在:
matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1].
原先(n - i - 1, n - j - 1)位置上元素旋转后,存在:
matrix[i][j] = matrix[n - j - 1][i].
所以旋转90度,就有如下的关系式,箭头左边表示原先位置,右边表示经过旋转90度后的位置。

以上写的是关于如何选择,还有1个重要的问题是“每次旋转,原地进行4个位置交换,选择哪一块区域进行遍历(i, j)?”
n是偶数,选择把矩阵划分4块区域,(i, j)选择第一区域,就能使用(i, j)表示整个矩阵的元素

n是奇数,如图划分,(i, j)选择第一区域,也能使用(i, j)表示整个矩阵的元素

public void rotate(int[][] matrix) {
int n = matrix.length;
int i, j, temp;
for (i = 0; i < n/2 ; i++){
for (j = 0; j < (n + 1) / 2; j++){
temp = matrix[i][j];
matrix[i][j] = matrix[n - j - 1][i];
matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1];
matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1];
matrix[j][n - i - 1] = temp;
}
}
}
评论区