给你一个 n x n的2D矩阵,代表一张图片,将这个图片旋转90度。
1. 常规思路(申请额外空间)
public void rotate(int[][] matrix)
{
// 先对matrix的情况进行判断
if (matrix == null || matrix.length == 0)
return;
// 翻转后的矩阵(使用额外的空间)
int[][] rotateMatrix = new int[matrix[0].length][matrix.length];
// 进行翻转
for (int i=0; i<matrix.length; i++)
{
for (int j=0; j<matrix[0].length; j++)
{
// 放到合适位置
rotateMatrix[j][matrix[0].length-1-i] = matrix[i][j];
}
}
for (int i=0; i<matrix.length; i++)
{
for (int j=0; j<matrix.length; j++)
{
matrix[i][j] = rotateMatrix[i][j];
}
}
return;
}
2. 通用解法
/**
* 顺时针旋转
* first reverse up to down, then swap the symmetry
* 1 2 3 7 8 9 7 4 1
* 4 5 6 => 4 5 6 => 8 5 2
* 7 8 9 1 2 3 9 6 3
*/
public void rotate(int[][] matrix)
{
if (matrix == null || matrix.length == 0 || matrix[0].length == 0)
return;
int rows = matrix.length; // 行数
int cols = matrix[0].length; // 列数
// 上下旋转
for (int first=0, last=rows-1; first<last; first++,last--)
{
int[] tmp = matrix[first];
matrix[first] = matrix[last];
matrix[last] = tmp;
}
for (int i=0; i<rows; i++)
{
for (int j=i+1; j<cols; j++)
{
int tmp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = tmp;
}
}
return;
}
/*
* 逆时针旋转
* first reverse left to right, then swap the symmetry
* 1 2 3 3 2 1 3 6 9
* 4 5 6 => 6 5 4 => 2 5 8
* 7 8 9 9 8 7 1 4 7
*/
public void antiRotate(int[][] matrix)
{
if (matrix == null || matrix.length == 0 || matrix[0].length == 0)
return;
int rows = matrix.length;
int cols = matrix[0].length;
for (int first = 0, last = cols - 1; first < last; first++, last--)
{
for (int i = 0; i < matrix.length; i++)
{
int tmp = matrix[i][first];
matrix[i][first] = matrix[i][last];
matrix[i][last] = tmp;
}
}
for (int i = 0; i < rows; i++)
{
for (int j = i + 1; j < cols; j++)
{
int tmp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = tmp;
}
}
}