题解 | 顺时针旋转矩阵
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param mat int整型二维数组 * @param n int整型 * @return int整型二维数组 */ public int[][] rotateMatrix (int[][] mat, int n) { // 参数校验 if (mat == null || n <= 1 || mat.length != n || mat[0].length != n) { return mat; } for (int i = 0; i < n / 2; i++) { for (int j = i; j < n - 1 - i; j++) { int temp = mat[i][j]; mat[i][j] = mat[n - 1 - j][i]; mat[n - 1 - j][i] = mat[n - 1 - i][n - 1 - j]; mat[n - 1 - i][n - 1 - j] = mat[j][n - 1 - i]; mat[j][n - 1 - i] = temp; } } return mat; } }
我来详细解释一下矩阵旋转算法的每一步:
1、参数校验
if (mat == null || n <= 1 || mat.length != n || mat[0].length != n) { return mat; }
2、遍历策略
for (int i = 0; i < n/2; i++) { for (int j = i; j < n-1-i; j++) {
3、四点旋转
假设有一个4×4矩阵:
[1 2 3 4] [5 6 7 8] [9 10 11 12] [13 14 15 16]
对于位置(i,j),需要旋转的四个点是:
temp = mat[i][j]; // 保存当前位置的值 mat[i][j] = mat[n-1-j][i]; // 左边 → 上边 mat[n-1-j][i] = mat[n-1-i][n-1-j]; // 下边 → 左边 mat[n-1-i][n-1-j] = mat[j][n-1-i]; // 右边 → 下边 mat[j][n-1-i] = temp; // 上边 → 右边
以第一次旋转为例(i=0, j=0):
一次完整的旋转后:
[13 2 3 1] [5 6 7 8] [9 10 11 12] [16 14 15 4]
继续进行下一个位置的旋转,直到完成所有需要的旋转操作。
为什么只需要遍历1/4的矩阵?
时间复杂度分析:
这种方法比之前的"先对角线翻转再垂直翻转"的方法更高效,因为每个元素只被移动一次。