玩命加载中 . . .

旋转图像


描述

给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。

你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。

示例 1:

img

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[7,4,1],[8,5,2],[9,6,3]]
示例 2:

img

输入: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--;
    }
}

文章作者: Jack Tim
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Jack Tim !
评论
  目录