0048. 旋转图像

  1. 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 的引用不会改变,但其内容会被替换。

代码步骤解析
  1. zip(*matrix)

    • *matrix 是解包操作,将 matrix 的每一行作为单独的参数传递给 zip 函数。
    • zip 函数将这些行组合成元组的列表,每个元组包含原来矩阵中同一列的元素。
  2. [row[::-1] for row in ...]

    • row[::-1] 是对每个元组进行逆序操作,即反转元组中的元素顺序。
    • 这个列表推导式遍历 zip(*matrix) 的结果,将每个元组反转后形成新的列表。
  3. matrix[:] = ...

    • matrix[:] 是一个切片操作,它引用了 matrix 的所有元素。
    • matrix[:] = ...matrix 的内容替换为右侧表达式的结果,即反转后的列表。

整体效果

这段代码实现了矩阵的顺时针旋转90度。具体步骤如下:

  1. 使用 zip(*matrix) 将矩阵的行转换为列。
  2. 使用 [row[::-1] for row in ...] 将每列逆序排列。
  3. 将结果赋值给 matrix,替换原有的内容。

示例

假设我们有一个矩阵 matrix

matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

使用上述代码进行旋转后:

  1. zip(*matrix) 的结果为 [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
  2. [row[::-1] for row in zip(*matrix)] 的结果为 [(7, 4, 1), (8, 5, 2), (9, 6, 3)]
  3. 最终 matrix 被更新为:
[
    [7, 4, 1],
    [8, 5, 2],
    [9, 6, 3]
]

这就是一个顺时针旋转90度后的矩阵。

总结

matrix[:] = ... 语句的作用是将 matrix 的内容替换为右侧表达式的结果,而不是创建一个新的列表。这样做的好处是不会改变 matrix 的引用,同时改变了其内容。

  • 15
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值