描述
给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[7,4,1],[8,5,2],[9,6,3]]
示例 2:
输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
输出:[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/rotate-image
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
这个题目要求我们将一个n x n的二维矩阵顺时针旋转90度。解决这个问题的关键在于找到一种方法来对矩阵进行变换。
我们可以先将矩阵沿着对角线翻转,然后再沿着中心水平线翻转。这样就可以得到顺时针旋转90度后的矩阵。
对于矩阵中的每一个元素,我们可以通过其在矩阵中的行列下标来访问它。在第一个循环中,我们遍历矩阵的上半部分(即i < j),并将matrix[i][j]和matrix[j][i]交换。这个操作相当于将矩阵沿着对角线翻转。
在第二个循环中,我们遍历矩阵的每一行,并将每一行的左右两侧元素交换。这个操作相当于将矩阵沿着中心水平线翻转。
最后,我们可以将以上两个操作组合起来,就可以得到完整的顺时针旋转90度的操作。
C++代码
void rotate(vector<vector<int>>& matrix) {
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]);
int temp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = temp;
}
}
// 然后反转二维矩阵的每一行
for (vector<int>& row : matrix) {
reverse(row.begin(), row.end());
}
}
// 反转一维数组
void reverse(vector<int>& arr) {
int i = 0, j = arr.size() - 1;
while (j > i) {
// swap(arr[i], arr[j]);
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
i++;
j--;
}
}