一、转置

java
for (int i = 0; i < n; i++)
for (int j = i+1; j < n; j++) // 只遍历上三角,避免重复交换
swap(matrix[i][j], matrix[j][i]);
二、翻转
水平翻转(左右翻转)

java
public void horizontalFlip(int[][] matrix) {
int n = matrix.length;
for (int i = 0; i < n; i++) {
int[] row = matrix[i];
for (int j = 0; j < n / 2; j++) { // 只走到一半,避免换两次
int tmp = row[j];
row[j] = row[n - 1 - j];
row[n - 1 - j] = tmp;
}
}
}
垂直翻转(上下翻转)

写法一:原地,交换行内元素
java
public void verticalFlip(int[][] matrix) {
int n = matrix.length;
int m = matrix[0].length;
for (int i = 0; i < n / 2; i++) {
for (int j = 0; j < m; j++) {
int tmp = matrix[i][j];
matrix[i][j] = matrix[n - 1 - i][j];
matrix[n - 1 - i][j] = tmp;
}
}
}
写法二:原地,交换整行引用
java
public void verticalFlip(int[][] matrix) {
int n = matrix.length;
for (int i = 0; i < n / 2; i++) {
int[] tmp = matrix[i];
matrix[i] = matrix[n - 1 - i];
matrix[n - 1 - i] = tmp;
}
}
三、旋转
顺时针90° = 转置+每行左右翻转

逆时针90° = 转置+每行上下翻转

旋转180° = 中心对称 = 水平翻转+垂直翻转

因为 180° 是中心对称,每对元素只交换一次。遍历左上四分之一区域即可避免重复:
java
public void rotate180(int[][] matrix) {
int n = matrix.length;
for (int i = 0; i < (n + 1) / 2; i++) {
for (int j = 0; j < n / 2; j++) {
int tmp = matrix[i][j];
matrix[i][j] = matrix[n - 1 - i][n - 1 - j];
matrix[n - 1 - i][n - 1 - j] = tmp;
}
}
}