旋转图像
题目描述:
给定一个 n × n 的二维矩阵 matrix
表示一个图像。请你将图像顺时针旋转 90 度。
你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
示例 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]]
提示:
n == matrix.length == matrix[i].length
1 <= n <= 20
-1000 <= matrix[i][j] <= 1000
方法一思路分析:
使用辅助数组,观察下图中的旋转规律
可以得出:矩形处于n行m列的元素在旋转后成为第m行的倒数n列的元素。
即由矩阵中的行列从 0 开始计数,因此对于矩阵中的元素 matrix[row][col],在旋转后,它的新位置为nums[col][n−row−1]。
代码实现:
class Solution {public void rotate(int[][] matrix) {int n = matrix.length;int[][] nums = new int [n][n];for(int i = 0; i<n; i++){for(int j = 0; j < n; j++){nums[j][n-i-1] = matrix[i][j];}}for(int i = 0; i<n; i++){for(int j = 0; j<n; j++){matrix[i][j] = nums[i][j];}}}
}
方法二思路分析:
-
确定旋转的层数:
由于矩阵是方阵(即行数和列数相等)。因此,我们只需要旋转矩阵的n/2
层(n
是矩阵的边长) -
确定每一层需要旋转的元素:
在每一层中,我们不需要旋转所有的元素,因为矩阵是对称的。我们只需要旋转每一层的“上半部分”(不包括对角线),然后对角线元素(如果有的话)会自然地处于正确的位置。因此,对于每一层,我们只需要处理(n + 1) / 2
列(或行,因为它们是等价的)。 -
顺时针旋转元素:
对于每一层中的每个元素,我们按照顺时针方向进行旋转。具体来说,我们首先将当前元素(matrix[i][j]
)的值保存在一个临时变量temp
中,然后依次将元素移动到它们顺时针旋转后的位置。最后,将temp
(即原始当前元素的值)放到它顺时针旋转后的最终位置(即上方位置)。 -
执行循环:
通过嵌套循环遍历每一层和每一层中的元素,并执行上述的旋转操作。
代码实现:
class Solution { public void rotate(int[][] matrix) { int n = matrix.length; // 获取矩阵的边长(假设矩阵是方阵) // 外层循环控制要旋转的层数,只需旋转n/2层 for (int i = 0; i < n / 2; ++i) { // 内层循环控制每一层中需要旋转的列数(注意,由于是对称旋转,所以只处理一半即可) // (n + 1) / 2 是因为当n为奇数时,中间的行/列只会被遍历一次 for (int j = 0; j < (n + 1) / 2; ++j) { // 使用一个临时变量temp来保存当前位置(左上)的值 int temp = matrix[i][j]; // 按顺时针方向,依次将右上、右下、左下三个位置的值移动到当前位置(左上) // 1. 将左下方位置的值移动到左上位置 matrix[i][j] = matrix[n - j - 1][i]; // 2. 将右下方位置的值移动到刚才左下方位置 matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1]; // 3. 将右上方位置的值移动到刚才右下方位置 matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1]; // 4. 将temp(即原左上位置的值)移动到刚才右上方位置 matrix[j][n - i - 1] = temp; } } }
}