题目:
给定一个 n × n 的二维矩阵matrix
表示一个图像。请你将图像顺时针旋转 90 度。
进阶:在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
思路:
笔者粗略画了一个4X4的例子图,可以把每种颜色的数字当作一个小整体,他们各自都按照顺时针箭头的方向旋转。以蓝色部分的数字2作为基准
,假设数字2
所在的位置为matrix[row][col]
,那么旋转90度之后就到了绿色部分位置8
,该数字的行号是基准数字2的列号
,列号是矩阵长度-基准数字2的差
,因此8
的索引位置为matrix[col][matrix.length - row - 1]
同理可得,绿色部分的8
会旋转到粉色部分的数字15
,该位置相当于基准数字2旋转了180度,行号和列号都是相对的,观察即可看出粉色部分的数字15
的位置索引为matrix[matrix.length - row - 1][matrix.length - col - 1
。
再次旋转就会转到黄色部分的数字9
,该数字的索引位置为matrix[matrix.length - col - 1][row]
。
知道了数字是怎么反转之后,就剩下写代码了,但要保证原地反转,就要避免出现数字覆盖,可以先设置一个临时变量temp来存储每一次的蓝色部分的基准值,然后倒着赋值防止数字覆盖,总的来说就是黄色部分对应值->蓝色部分对应值,粉色部分对应值->黄色部分对应值,绿色部分对应值->粉色部分对应值,,最后将存储在临时变量temp中的值赋值给绿色部分对应值完成一次数值旋转
以下为代码+注释:
public void rotate(int[][] matrix) {
// 原地反转
int len = matrix.length;
for(int row = 0; row < len / 2; row++){
// 列多+1,如果长度为偶数的话向下取整和原来相同
// 如果为奇数就多向后遍历一个
for(int col = 0; col < (len + 1) / 2; col++){
int temp = matrix[row][col];
matrix[row][col] = matrix[len - col - 1][row];
matrix[len - col - 1][row] = matrix[len - row - 1][len - col - 1];
matrix[len - row - 1][len - col - 1] = matrix[col][len - row - 1];
matrix[col][len - row - 1] = temp;
}
}
}
笔者也在不断学习,如有错误,欢迎指正!