方法一:使用新数组。
首先我们需要对题目进行分析,在二维数组进行90°旋转后他们的位置是怎么样的。
我们以下图为例
在他进行90°旋转后我们可以得到以下的结果。
第一行的第 x 个元素在旋转后恰好是倒数第一列的第 x 个元素。
对于第二行来说,矩阵中的第x行的第y个元素,他变化后的位置就是 第y行的倒数第i列。
我们把上面的话翻译成公式就是: matrix[x] [y],旋转后变成matrix[y] [n-1-x]。那么下面我们看代码
public void rotate(int[][] matrix) {
//获取数组长度因为数组是矩形所以不需要处理(长宽一致)。
int n = matrix.length;
//创建新的数组用来容纳变化后的矩阵
int[][] matrix_new = new int[n][n];
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
//将旧的位置的数填入新数组的相应的位置。
matrix_new[j][n - i - 1] = matrix[i][j];
}
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
//最后填充
matrix[i][j] = matrix_new[i][j];
}
}
}
上面这种方法使用了额外的内存,下面我们使用翻转代替旋转
方法二:翻转代替旋转
还是使用这个数组作为例子
下面我们通过水平翻转得到如下数组
再进行对角线翻转
反转后我们就得到了旋转后的矩阵
对于水平轴翻转而言,我们只需要枚举矩阵上半部分的元素,和下半部分的元素进行交换,即列不变交换行位置:
matrix[x] [y] ================》matrix[n-1-x] [y]
对于主对角线翻转而言,我们只需要枚举对角线左侧的元素,和右侧的元素进行交换,即交换行和列:
matrix[x] [y] ================》matrix[y] [x]
将它们组合在一起,进行联立即可得到:
matrix[x] [y] ================》matrix[n-1-x] [y]============》matrix[y] [n-1-x]
进行简化:
matrix[x] [y] ================》matrix[y] [n-1-x]
下面我们来看代码:
public void rotate(int[][] matrix) {
int n = matrix.length;
// 进行水平翻转,n/2可以控制翻转。
for (int i = 0; i < n / 2; ++i) {
for (int j = 0; j < n; ++j) {
//使用temp 进行数值保存
int temp = matrix[i][j];
matrix[i][j] = matrix[n - i - 1][j];
matrix[n - i - 1][j] = temp;
}
}
// 主对角线翻转
for (int i = 0; i < n; ++i) {
for (int j = 0; j < i; ++j) {
int temp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = temp;
}
}
}