概述:
实现 n×m 的矩阵的顺时针、逆时针旋转,以及n×n的矩阵沿 y=x 和 y=-x 的对折。
实现思路:
对于矩阵转置这一类问题,关键在于找出转置前后的位置关系。
以2×3的矩阵的顺时针旋转为例:
原矩阵:
1,2,3
4,5,6
转置后:
4,1
5,2
6,3
找出转置前后的位置关系:
(0,0) -> (0,1) -> (0,2-1-0)
(0,1) -> (1,1) -> (1,2-1-0)
(0,2) -> (2,1) -> (2,2-1-0)
(1,0) -> (0,0) -> (0,2-1-1)
(1,1) -> (1,0) -> (1,2-1-1)
(1,2) -> (2,0) -> (2,2-1-1)
所以转置前后的关系为(设矩阵为 n×m 的矩阵):
(x,y) -> (y,n-1-x)
其它情况的矩阵转置和上面一样。
代码实现如下:
public class ArrayRotation {
/**
* 顺时针旋转
* @param array
* @return
*/
public int[][] clockwiseRotation(int[][] array) {
int rows = array.length;
int cols = 0;
for (int i = 0; i < array.length; i++) {
int tmp = array[i].length;
if (tmp > cols) {
cols = tmp;
}
}
int[][] traned = new int[cols][rows];
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
traned[j][rows - 1 - i] = array[i][j];
}
}
return traned;
}
/**
* 逆时针旋转
* @param array
* @return
*/
public int[][] anticlockwiseRotation(int[][] array) {
int rows = array.length;
int cols = 0;
for (int i = 0; i < array.length; i++) {
int tmp = array[i].length;
if (tmp > cols) {
cols = tmp;
}
}
int[][] traned = new int[cols][rows];
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
traned[cols - 1 - j][i] = array[i][j];
}
}
return traned;
}
/**************************/
/**
* 沿 y = -x 对折
* @param array
* @return
*/
public int[][] fold(int[][] array) {
int rows = array.length;
int cols = 0;
for (int i = 0; i < array.length; i++) {
int tmp = array[i].length;
if (tmp > cols) {
cols = tmp;
}
}
if (cols == rows) {
int[][] traned = new int[cols][rows];
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
traned[j][i] = array[i][j];
}
}
return traned;
}
return null;
}
/**
* 沿 y = x 对折
* @param array
* @return
*/
public int[][] antiFold(int[][] array) {
int rows = array.length;
int cols = 0;
for (int i = 0; i < array.length; i++) {
int tmp = array[i].length;
if (tmp > cols) {
cols = tmp;
}
}
if (cols == rows) {
int[][] traned = new int[cols][rows];
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
traned[cols - 1 - j][rows - 1 - i] = array[i][j];
}
}
return traned;
}
return null;
}
}