You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise).
即将一个n * n的二维数组顺时针旋转90度(旋转结果:即将第一行搬至倒数第一列,第二行搬至倒数第二列,依次搬移数组)
方法一:创建一个同等大小的二维数组,将每次搬移后的结果保存到新数组中,最后用新数组替换原数组
代码如下:
public class Solution {
// 旋转90度,即将第一行搬至倒数第一列,第二行搬至倒数第二列。。。
public void rotate(int[][] matrix) {
int[][] result = new int[matrix.length][matrix.length];
int[] temp;
for(int i = 0; i < matrix.length; i++)
{
temp = matrix[i];
for(int j = 0; j < matrix.length; j++)
{
result[j][matrix.length - 1 - i] = temp[j];
}
}
for(int i = 0; i < matrix.length; i++)
{
for(int j = 0; j < matrix.length; j++)
matrix[i][j] = result[i][j];
}
}
}
方法一思路清晰,但是空间复杂度为O(n^2)
方法二:将旋转90度拆分为沿副对角线翻转一次,然后沿水平中线翻转一次,图示如下
代码如下:
public class Solution {
// 旋转90度,即将第一行搬至倒数第一列,第二行搬至倒数第二列。。。
public void rotate(int[][] matrix) {
int temp;
int n = matrix.length;
// 沿着副对角线反转
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n - i; j++)
{
temp = matrix[i][j];
matrix[i][j] = matrix[n - 1 - j][n - 1 - i];
matrix[n - 1 - j][n - 1 - i] = temp;
}
}
// 沿着水平中线反转
for (int i = 0; i < n / 2; i++)
{
for (int j = 0; j < n; j++)
{
temp = matrix[i][j];
matrix[i][j] = matrix[n - 1 - i][j];
matrix[n - 1 - i][j] = temp;
}
}
}
}
方法二将旋转进行了拆分,每一次都可以直接交换两个点的值,而不会影响其他值,从而不需要开辟过多空间。