每日一练:LeeCode-48、旋转图像【二维数组+行列交换】

发布于:2024-04-04 ⋅ 阅读:(79) ⋅ 点赞:(0)

给定一个 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]]

提示:

  • n == matrix.length == matrix[i].length
  • 1 <= n <= 20
  • -1000 <= matrix[i][j] <= 1000

方法1:直接循环交换

在这里插入图片描述
它采用了直接交换的方法通过循环对矩阵的每一个环进行旋转

class Solution {
    public void rotate(int[][] matrix) {
        int length = matrix.length; // 获取矩阵的长度

        // 遍历矩阵的每一个环
        for (int i = 0; i < length / 2; i++) { // 计算需要旋转的大圈数
            for (int j = i; j < length - i - 1; j++) { // j < length - i - 1:确定需要旋转的每 4 个数的小圈数
                int temp = 0;
                int m = length - i - 1; // m,n 确定 matrix[i][j] 外,其他数的相对位置
                int n = length - j - 1;

                // 结合图实际比对,对应位置互换
                temp = matrix[i][j];
                matrix[i][j] = matrix[n][i];
                matrix[n][i] = matrix[m][n];
                matrix[m][n] = matrix[j][m];
                matrix[j][m] = temp;
            }
        }
    }
}

这个函数接受一个二维矩阵 matrix 作为输入,并且直接对该矩阵进行原地修改,使其顺时针旋转 90 度。函数使用了两层循环来遍历矩阵的每一个环,然后对每一个环中的元素进行交换。
具体地,外层循环 i 表示需要旋转的大圈数,内层循环 j 表示当前需要旋转的小圈数。在内层循环中,通过计算得到需要交换的四个位置的坐标,然后将它们对应位置上的元素进行交换。

这种算法的时间复杂度为 O(n^2),其中 n 是矩阵的边长。因为对于一个 n x n 的矩阵,需要旋转的环的数量是 n/2,每个环中有 4 个元素需要交换,所以总的操作次数为 4 * n/2 * n/2 = 2n^2。

方法2:先上下交换,在对角线交换(最容易理解)

在这里插入图片描述

将一个二维矩阵顺时针旋转 90 度。它分两步进行旋转:先进行上下交换,然后进行对角线交换。

class Solution {
    public void rotate(int[][] matrix) {
        int length = matrix.length;

        // 先上下交换
        for (int i = 0; i < length / 2; i++) {
            int[] temp = matrix[i];
            matrix[i] = matrix[length - i - 1]; // 注意 length - i - 1:需要变化,往上移
            matrix[length - i - 1] = temp;
        }

        // 再对角线交换
        for (int i = 0; i < length; i++) {
            for (int j = i + 1; j < length; j++) {
                int temp = matrix[i][j];
                matrix[i][j] = matrix[j][i];
                matrix[j][i] = temp;
            }
        }
    }
}

这个函数接受一个二维矩阵 matrix 作为输入,并且直接对该矩阵进行原地修改,使其顺时针旋转 90 度。

  • 首先,外层循环遍历了矩阵的上半部分,通过交换每一行与对称位置的行,实现了上下交换。
  • 接着,内层循环遍历了矩阵的对角线上半部分(左上角到右下角的对角线),通过交换对角线两侧的元素,实现了对角线交换。

这种算法的时间复杂度为 O(n^2),其中 n 是矩阵的边长。