【模拟】LeetCode 48. 旋转图像【中等】

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

提示:

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

分析

方法一:使用辅助数组

以题目中的示例二作为例子:

分析将图像旋转90度之后,这些数字出现在什么位置。

对于矩阵中的第一行而言,旋转后,它出现在倒数第一列的位置:

并且,第一行的第x个元素在旋转后恰好是倒数第一列的第x个元素。

对于矩阵中第二行而言,旋转后,它出现在倒数第二列的位置:

 

对于矩阵中的第三行和第四行同理。这样我们可以得到规律:

  对于矩阵中的第i行的第j个元素,旋转后,它出现在倒数第i列的第j个位置。

我们将该规律翻译成代码。由于矩阵中的行列从0开始计数,因此对于矩阵中的元素matrix[row][col],在旋转后,它的新位置为matrix[col][n - row - 1],比如上面矩阵中的数字2,matrix[1][0]==>matrix[0][4-1-1]=matrix[0][2]。

这样以来,我们使用一个与matrix大小相同的辅助数组matrixnew,临时存储旋转后的结果。我们遍历matrix只的每一个元素,根据上述规则将该元素存放到matrixnew中对应位置,在遍历完成后,再将matrixnew中的结果复制到原数组中即可。

class Solution:
    def rotate(self, matrix: List[List[int]]) -> None:
        """
        Do not return anything, modify matrix in-place instead.
        """
        n = len(matrix)
        # Python 这里不能 matrix_new = matrix 或 matrix_new = matrix[:] 因为是引用拷贝
        matrix_new = [[0] * n for _ in range(n)]

        for i in range(n):
            for j in range(n):
                matrix_new[j][n - i - 1] = matrix[i][j]
        # 不能写成matrix = matrix_new
        matrix[:] = matrix_new

时间复杂度:O(N2),其中N是matrix的边长。

空间复杂度:O(N2),我们需要使用一个和matrix大小相同的辅助数组。

方法二:原地旋转

题目中要求我们尝试在不使用额外内存空间的情况下进行矩阵的旋转,也就是说,我们需要原地旋转这个矩阵,那么我们如果在方法一的基础上完成原地旋转呢?

我们观察方法一中的关键等式:

matrix_new[j][n - i - 1] = matrix[i][j]

它阻止了我们进行原地旋转,这是因为如果我们直接将matrix[row][col]放到原矩阵中的目标位置matrix[col][n - row - 1]:

matrix_new[j][n - i - 1] = matrix[i][j]

原矩阵中的matrix[col][n - row - 1]就被覆盖掉了,这并不是我们想要的结果。因此我们可以考虑用一个临时变量temp暂存matrix[col][n - row - 1]的值,这样虽然matrix[col][n - row - 1]被覆盖了,还是可以通过temp获取到它原来的值:

 

 那么matrix[col][n - row - 1]经过旋转之后会到哪个位置上呢?我们还是使用方法一中的关键等式,不过这一次,我们需要将:

代入关键等式,就可以得到:

同样地,直接赋值会覆盖掉matrix[n - row - 1][n - col - 1]原来的值,因此我们还是需要使用一个临时变量进行存储,不过这次,我们可以直接使用之前的临时变量temp:

 

我们再重复一次之前的操作, matrix[n - row - 1][n - col - 1]经过旋转之后会到哪一个位置上呢?

自己看吧👀https://leetcode.cn/problems/rotate-image/solution/xuan-zhuan-tu-xiang-by-leetcode-solution-vu3m/

class Solution:
    def rotate(self, matrix: List[List[int]]) -> None:
        n = len(matrix)
        for i in range(n // 2):
            for j in range((n + 1) // 2):
                matrix[i][j], matrix[n - j - 1][i], matrix[n - i - 1][n - j - 1], matrix[j][n - i - 1] \
                    = matrix[n - j - 1][i], matrix[n - i - 1][n - j - 1], matrix[j][n - i - 1], matrix[i][j]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2022-05-28 14:39  Ariel_一只猫的旅行  阅读(61)  评论(0编辑  收藏  举报