目录
网站原题
力扣:48. 旋转图像
给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
提示:
n == matrix.length == matrix[i].length
1 <= n <= 20
-1000 <= matrix[i][j] <= 1000
分析解答
矩阵的转置最常用的方法是借助辅助矩阵暂存原矩阵各元素,再按转置后的位置索引重新填入各元素,相当于把一个盘子里不同颜色的巧克力豆倒在另一个空碗里,再按照重新排列的顺序放回原来的盘子中,两次转存操作的空间复杂度为O(N^2)。
这里借助append方法实现排序和暂存的功能,性能与辅助矩阵基本一致:
class Solution:
def rotate(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
n = len(matrix)
index = 0
for i in range(0,n):
matrix.append([])
for i in range(0,n):
matrix[len(matrix)-1].append(matrix[n-i-1][index])
index += 1
matrix[:] = matrix[n:]
return matrix
值得注意的是,题目反复提醒“原地修改”的用意,并不是指不允许构建新的矩阵,而是要求重复利用原始矩阵的存储空间,将对 matrix
的更改都反映在原始列表中。所以直接把转置后的矩阵复制给“matrix”是行不通的,因为这相当于更改了“matrix”指向的对象地址,而不是修改了原矩阵存储地址中的元素:
matrix = matrix[n:]
详细说来:
matrix[:] = matrix[n:]
:这行代码表示将matrix[n:]
中的元素赋值给matrix
,但仍然保持了原始的内存引用,因此任何对matrix
的更改都将反映在原始列表中。这是一种原地修改matrix
的方式。
matrix = matrix[n:]
:这行代码表示创建了一个新的列表,其中包含了matrix[n:]
中的元素,并将matrix
变量重新指向了这个新列表。这将导致原始的matrix
列表与新列表不再有关联,任何对matrix
的更改都不会影响原始列表。