方法1:原地旋转
class Solution {
public void rotate(int[][] matrix) {
/*
单独写一下数组中元素的原位置以及旋转之后的位置可以发现这样一个规律:
(i,j)位置的元素最终的位置是(j,n-i);这里n是matrix.length-1;
这样进行多次操作如下:
(i,j)->(j,n-i)->(n-i,n-j)->(n-j,i)->(i,j)
可以发现,再进行多次将单个数的“旋转”(放到了旋转后的位置)就回到了原来的位置
可以将矩阵分成四个部分:
1 | 2
3 | 4
(i,j)在1位置,(j,n-i)在2位置,(n-i,n-j)在4位置,(n-j,i)在3位置
因此可以直接遍历1中的所有元素,每个元素都进行“一轮”交换,就能得到最终的结果
*/
int n = matrix.length - 1;
int temp;
for(int i = 0;i < matrix.length / 2;i++){
for(int j = 0;j < (matrix.length + 1) / 2;j++){
temp = matrix[i][j];
matrix[i][j] = matrix[n-j][i];
matrix[n-j][i] = matrix[n-i][n-j];
matrix[n-i][n-j] = matrix[j][n-i];
matrix[j][n-i] = temp;
}
}
}
方法2:矩阵翻转
class Solution {
public void exchange(int[][] matrix,int i,int j,int tarI,int tarJ){
int temp = matrix[i][j];
matrix[i][j] = matrix[tarI][tarJ];
matrix[tarI][tarJ] = temp;
}
public void rotate(int[][] matrix) {
/**
每个元素最后的位置为(i,j) -> (j,n-i) ;这里n是matrix.length-1
想办法看能不能进行多次翻转操作得到结果。
常用的翻转:1.水平翻转:(i,j)->(n-i,j) 2.左右翻转:(i,j)->(i,n-j)
3.对角线翻转:(i,j)->(j,i) 4.反对角线翻转:(i,j)->(n-j,n-i)
可以有很多种组合得到需要的结果
这里选择(i,j)水平(n-i,j)对角线(j,n-i)
*/
int n = matrix.length - 1;
//1.先水平
for(int i = 0;i < matrix.length / 2;i++){
for(int j = 0;j < matrix.length;j++)
exchange(matrix,i,j,n-i,j);
}
//2.再对角线
for(int i = 0;i < matrix.length;i++){
for(int j = i+1;j < matrix.length;j++)
exchange(matrix,i,j,j,i);
}
}
}