一、转置
for (int i = 0; i < n; i++) for (int j = i+1; j < n; j++) // 只遍历上三角,避免重复交换 swap(matrix[i][j], matrix[j][i]);867. 转置矩阵 - 力扣(LeetCode)
二、翻转
水平翻转(左右翻转)
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; } } }垂直翻转(上下翻转)
写法一:原地,交换行内元素
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; } } }写法二:原地,交换整行引用
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° = 转置+每行上下翻转
48. 旋转图像 - 力扣(LeetCode)
旋转180° = 中心对称 = 水平翻转+垂直翻转
因为 180° 是中心对称,每对元素只交换一次。遍历左上四分之一区域即可避免重复:
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; } } }四、斜对角位置判断
如图所示,对于 ↗ 方向的格子,行号加列号是不变的。对于 ↖ 方向的格子,行号减列号是不变的。
典型应用:51. N 皇后 - 力扣(LeetCode)