一 将正方形矩阵顺时针转动90°
给定一个N×N的矩阵matrix,把这个矩阵调整成顺时针转动90°后的形式。
顺时针转动90°后为:
【要求】额外空间复杂度为O(1)。
public void rotate(int[][] matrix) {
int tR = 0; // 左上角行坐标
int tC = 0; // 左上角列坐标
int dR = matrix.length - 1; // 右下角行坐标
int dC = matrix[0].length - 1; // 右下角列坐标
while (tR < dR) { // 循环条件:左上角坐标不能超过右下角坐标
rotateEdge(matrix, tR++, tC++, dR--, dC--); // 旋转每一层
}
}
private void rotateEdge(int[][] matrix, int tR, int tC, int dR, int dC) {
int times = dC - tC; // 当前层的元素个数
int tmp = 0; // 用于交换的中间变量
for (int i = 0; i < times; i++) { // 循环遍历当前层的元素
tmp = matrix[dR][tC + i];
matrix[tR][tC + i] = matrix[dR - i][tC];
matrix[dR - i][tC] = matrix[dR][dC - i];
matrix[dR][dC - i] = matrix[tR + i][dC];
matrix[tR + i][dC] = tmp;
}
}
这段代码实现了一个将二维数组(矩阵)顺时针旋转90度的方法,采用边界逐层旋转的方式。
rotate() 方法中,使用四个变量来记录矩阵的左上角坐标和右下角坐标,并在 while 循环中不断收缩边界,对每一层使用 rotateEdge() 方法来旋转。
rotateEdge() 方法是旋转操作的核心,其中 times 记录当前层的元素个数,tmp 用于保存当前要旋转的元素,通过四个 for 循环分别完成旋转操作,具体如下:
-
将矩阵的右上角元素 m[dR][tC+i] 赋值给左上角元素 m[tR][tC+i]
-
将矩阵的左下角元素 m[dR-i][tC] 赋值给右上角元素 m[tR][tC+i]
-
将矩阵的左上角元素 m[dR][tC-i] 赋值给左下角元素 m[dR-i][tC]
-
将 tmp 值赋值给右下角元素 m[tR+i][dC]
在 rotateEdge() 方法中,使用 for 循环遍历每一层元素,i 从 0 开始,每次循环收缩一圈,直到完成该层所有元素的旋转。