48. 旋转图像

161 阅读3分钟

【题目】

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

【题目解析】

解题方法

顺时针旋转90度的操作可以通过两个步骤完成:首先是矩阵的转置(行列互换),接着是每一行的反转。这两个操作均可以在原地完成,满足题目要求。

  • 转置矩阵:对于矩阵中的每一个元素matrix[i][j],通过交换操作将其移动到matrix[j][i]的位置。
  • 反转每一行:将转置后的每一行进行反转,即可完成90度旋转。
class Solution:
    def rotate(self, matrix):
        n = len(matrix)
        # 转置矩阵
        for i in range(n):
            for j in range(i, n):
                matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
        # 反转每一行
        for row in matrix:
            row.reverse()

执行效率

image.png

【总结】

适用问题类型

此方法适用于涉及二维矩阵操作的问题,特别是需要在原地对矩阵进行旋转、翻转或转置等操作的场景。它特别适合处理图像旋转问题,其中图像以二维矩阵的形式给出,并要求最小化额外空间使用。

解决算法:矩阵操作

  • 算法描述:本解法通过两个基本的矩阵操作——转置和行反转——来实现矩阵的顺时针旋转90度。

  • 算法特点

    • 原地操作:所有变换直接在输入矩阵上进行,不需要额外的存储空间。
    • 简洁性:算法实现简单,易于理解和编码。
    • 通用性:该方法不仅适用于90度旋转,通过调整操作顺序或增减步骤,也可以适用于其他角度的旋转或翻转问题。

时间复杂度与空间复杂度

  • 时间复杂度:O(N^2),其中N是矩阵的维度。这是因为算法需要遍历矩阵中的每个元素进行转置,随后再次遍历每一行进行反转。
  • 空间复杂度:O(1),算法在原矩阵上直接进行操作,不需要额外的空间来存储临时数据或结果。

实践意义

  • 图像处理:在图像处理领域,旋转图像是一项基本操作。本方法提供了一种高效且空间节约的实现方式,尤其适用于资源受限的环境,如嵌入式系统或移动设备。
  • 数据预处理:在数据科学和机器学习项目中,经常需要对数据集进行预处理,包括矩阵操作。掌握这种矩阵操作技巧可以帮助更快地完成数据准备工作。
  • 算法教育:作为矩阵操作的经典案例,这个问题及其解法对于教学和学习算法具有一定的示范意义,有助于学习者理解矩阵操作的基本概念和技巧。

综上所述,旋转图像问题的这种解法展示了矩阵操作在实际应用中的强大能力和灵活性,不仅在技术层面提供了有效的解决方案,也在教育和实践层面有着广泛的应用价值。

题目链接

旋转图像