48.旋转图像
给定一个 n × n 的二维矩阵 matrix
表示一个图像。请你将图像顺时针旋转 90 度。
你必须在原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[7,4,1],[8,5,2],[9,6,3]]
思路
- 先将矩阵转置。
- 再将每一行从两端开始交换。
//交换元素
private void swap(int[][] matrix, int row1, int col1, int row2, int col2){
int temp = matrix[row1][col1];
matrix[row1][col1] = matrix[row2][col2];
matrix[row2][col2] = temp;
}
//旋转图像
public void rotate(int[][] matrix) {
int m = matrix.length;
//先转置矩阵
for(int i = 0; i < m; i++){
for(int j = 0; j < i; j++){
swap(matrix,i,j,j,i); // 将矩阵(i, j)和(j, i)位置的元素交换
}
}
//再将每一行从两端开始交换
for(int i = 0; i < m; i++){ //控制行变换
for(int j = 0; j < m / 2; j++){ //控制列变化
swap(matrix, i, j, i, m-j-1);
}
}
}
[!NOTE]
转置的时候,j 的变化是从 0 到 i,不是 0 到 m,如果是后者,就会出现换过去又换回来的结果。