You are given an n x n 2D matrix representing an image.
Rotate the image by 90 degrees (clockwise).
Follow up:
Could you do this in-place?
第一个想法是 找找转换关系
确实存在 原来第i行第j列 到新的矩阵映射为第j行第n-1-i列
如果允许新开一个矩阵 那么到这里应该就可以了
但是题目要求不能新开矩阵 要“就地”修改
那么知道了单个位置元素的目标位置还不够 还得知道目标位置元素的目标位置
再考虑到顺时针90度 就发现和一维数组的旋转没什么区别了 只不过是二维是4个值后会本身
遍历第一象限的每个元素:
temp = 当前元素
当前 = 逆时针90
逆时针90 = 逆时针180
逆时针180 = 逆时针270
逆时针270 = temp
public class Solution {
public static void main(String[] args) {
Solution solution = new Solution();
int[][] matrix = solution.generateMatrix(6);
solution.printMatrix(matrix);
solution.rotate(matrix);
solution.printMatrix(matrix);
}
public int[][] generateMatrix(int length){
int[][] result = new int[length][length];
int temp = 1;
for(int i = 0;i < length;i++)
for(int j = 0;j < length;j++)
result[i][j] = temp++;
return result;
}
public void printMatrix(int[][] matrix){
for(int i = 0;i < matrix.length;i++){
for(int j = 0;j < matrix[0].length;j++)
System.out.printf("%4d",matrix[i][j]);
System.out.println();
}
System.out.println("********************");
}
public void rotate(int[][] matrix) {
int temp;
int n = matrix.length;
for(int i = 0;i < (n+1)/2;i++){
for(int j = 0;j < n/2;j++){
temp = matrix[i][j];
matrix[i][j] = matrix[n-1-j][i]; //为m[i][j]赋值
matrix[n-1-j][i] = matrix[n-1-i][n-1-j];//为逆90度赋值
matrix[n-1-i][n-1-j] = matrix[j][n-1-i];//为逆180度赋值
matrix[j][n-1-i] = temp;//为逆270度赋值
}
}
}
}