旋转一个 n × n 的二维矩阵顺时针 90 度可以通过多种方法实现,以下是几种常见的方法:
方法一:使用辅助数组
这种方法通过创建一个新的矩阵来存储旋转后的结果,然后将其复制回原矩阵。虽然这种方法简单,但它使用了额外的空间,不符合题目要求的原地旋转。
```cpp
void rotate(vector int n = matrix.size(); vector for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { new_matrix[j][n - 1 - i] = matrix[i][j]; } } matrix = new_matrix; } ``` 方法二:原地旋转,空间优化 这种方法通过四次翻转来实现原地旋转,不需要额外的空间。具体步骤如下: 1. 沿主对角线翻转。 2. 沿水平中线翻转。 ```cpp void rotate(vector int n = matrix.size(); // 主对角线翻转 for (int i = 0; i < n; ++i) { for (int j = i; j < n; ++j) { swap(matrix[i][j], matrix[j][i]); } } // 水平中线翻转 for (int i = 0; i < n / 2; ++i) { for (int j = 0; j < n; ++j) { swap(matrix[i][j], matrix[n - 1 - i][j]); } } } ``` 方法三:分层旋转 这种方法通过逐层旋转来实现原地旋转。每一层找到四个顶点,旋转 90 度,然后通过对顶点坐标的改变,来将其他的元素旋转 90 度。 ```cpp void rotate(vector int n = matrix.size(); int p = 0; int len = matrix.length - 1; int add; int temp; while (p < len) { add = p; while (add < len) { temp = matrix[p][add]; matrix[p][add] = matrix[len - add][p]; matrix[len - add][p] = matrix[len - p][len - add]; matrix[len - p][len - add] = matrix[add][len - p]; matrix[add][len - p] = temp; add++; } p++; } } ``` 总结 以上三种方法都可以实现图像的顺时针旋转 90 度,选择哪种方法取决于具体的需求和限制条件。如果需要原地旋转且空间有限,建议使用方法二或方法三。如果可以使用额外的空间,方法一也是一个可行的选择。