- Rotate Image
You are given an n x n 2D matrix representing an image, rotate the image by 90 degrees (clockwise).
You have to rotate the image in-place, which means you have to modify the input 2D matrix directly. DO NOT allocate another 2D matrix and do the rotation.
链接: 48. Rotate Image
思路一:辅助矩阵
思路:矩阵的横纵坐标都发生了哪些变化,以行为例,
class Solution:
def rotate(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
n=len(matrix)
tmp=copy.deepcopy(matrix)
for i in range(n):
for j in range( n ):
matrix[j][n-1-i]=tmp[i][j]
思路二
思路:先对矩阵做转置(行列互换),然后每行逆序
对矩阵进行转置,然后每行逆序就行
如果只是转置矩阵的话,直接zip就好了。这才想起来zip的本质就是这样的,取出列表中的对应位置的元素,组成新列表
在 Python 中,[:]
是一个切片操作符,用于复制列表或其他可变序列的引用,而不是创建一个新的列表。当你在函数中使用 matrix[:] = ...
时,将 matrix
的内容替换为右侧表达式的结果,而不是改变 matrix
的引用。
class Solution:
def rotate(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
matrix[:]=[row[::-1] for row in zip(*matrix)]
1. 列表赋值 vs. 列表替换
在 Python 中,当你简单地赋值一个列表给另一个变量时,实际上是将一个变量的引用指向了另一个变量所指向的同一个对象。例如:
a = [1, 2, 3]
b = a # b 和 a 指向同一个列表
a.append(4)
print(b) # 输出 [1, 2, 3, 4]
如果你想要创建一个新的列表,而不是引用同一个列表,可以使用切片操作:
a = [1, 2, 3]
b = a[:] # b 是 a 的一个浅拷贝
a.append(4)
print(b) # 输出 [1, 2, 3]
2. [:]
在列表中的应用
在你的代码片段中,matrix[:] = ...
的作用是将 matrix
的内容替换为右侧表达式的结果,而不是创建一个新的列表。这意味着 matrix
的引用不会改变,但其内容会被替换。
代码步骤解析
-
zip(*matrix)
:*matrix
是解包操作,将matrix
的每一行作为单独的参数传递给zip
函数。zip
函数将这些行组合成元组的列表,每个元组包含原来矩阵中同一列的元素。
-
[row[::-1] for row in ...]
:row[::-1]
是对每个元组进行逆序操作,即反转元组中的元素顺序。- 这个列表推导式遍历
zip(*matrix)
的结果,将每个元组反转后形成新的列表。
-
matrix[:] = ...
:matrix[:]
是一个切片操作,它引用了matrix
的所有元素。matrix[:] = ...
将matrix
的内容替换为右侧表达式的结果,即反转后的列表。
整体效果
这段代码实现了矩阵的顺时针旋转90度。具体步骤如下:
- 使用
zip(*matrix)
将矩阵的行转换为列。 - 使用
[row[::-1] for row in ...]
将每列逆序排列。 - 将结果赋值给
matrix
,替换原有的内容。
示例
假设我们有一个矩阵 matrix
:
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
使用上述代码进行旋转后:
zip(*matrix)
的结果为[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
。[row[::-1] for row in zip(*matrix)]
的结果为[(7, 4, 1), (8, 5, 2), (9, 6, 3)]
。- 最终
matrix
被更新为:
[
[7, 4, 1],
[8, 5, 2],
[9, 6, 3]
]
这就是一个顺时针旋转90度后的矩阵。
总结
matrix[:] = ...
语句的作用是将 matrix
的内容替换为右侧表达式的结果,而不是创建一个新的列表。这样做的好处是不会改变 matrix
的引用,同时改变了其内容。