package array;
/**
* 旋转图像
* <p>
* 给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
* <p>
* 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
* <p>
* <p>
* 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
* 输出:[[7,4,1],[8,5,2],[9,6,3]]
* <p>
* <p>
* 作者:力扣 (LeetCode)
* 链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnhhkv/
* 来源:力扣(LeetCode)
* 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
*/
public class RotateImage {
public static void main(String[] args) {
int[][] matrix = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
rotateMatrix(matrix);
for(int row=0; row< matrix.length; row++){
for (int column=0; column< matrix.length; column++){
System.out.println("Matrix "+matrix[row][column]);
}
}
}
/**
* 1 2 3 7 4 1
* 4 5 6 => 8 5 2
* 7 8 9 9 6 3
* <p>
* 要点:
*
* 旋转90度
*
* [i][j] ----> [j][n-i]
* [j][n-i] ----> [n-i][n-j]
* [n-i][n-j]----> [n-j][i]
* [n-j][i] ----> [i][j]
*
* [i][j]-->[j][n-i]-->[n-i][n-j]-->[n-j][i]-->[i][j]
*
* i =0, j = 1 n=2 是
* 8--> 4 8替换4 M[2][1] (8) --->M[1][0] (4) ----> [n-i][n-j] -->[n-j][i]
* 6--> 8 6替换8 M[1][2] (6) --->M[2][1] (8) ----> [j][n-i] --->[n-i][n-j]
* 2--> 6 2替换6 ...
* 4--> 2 4替换2 ...
*
* 这个公式推导很难,很难知道之间的关系,需要仔细思考,看了答案才知道怎么考虑的
*
* 1 2 ---> 3 1
* 3 4 4 2
*
**/
private static void rotateMatrix(int[][] matrix) {
int n = matrix.length -1;
int temp = 0;
for (int i =0; i< (n+1)/2; i++) { // (n+1)/2是旋转次数 如果是n = 4的话 旋转就分为内外两层 (4+1/2 = 2
for (int j = i; j< n-i; j++) {
temp = matrix[n-j][i]; // 这句的意思是先记住原来的值是多少,因为后面的操作会覆盖掉,且最终要给 matrix[i][j] 赋值用
matrix[n-j][i] = matrix[n-i][n-j];
matrix[n-i][n-j] = matrix[j][n-i];
matrix[j][n-i] = matrix[i][j];
matrix[i][j] = temp;
}
}
}
}
输出:
Matrix 7
Matrix 4
Matrix 1
Matrix 8
Matrix 5
Matrix 2
Matrix 9
Matrix 6
Matrix 3
查看其他人的思路:1. 先上下交换 2. 对角线交换