矩阵逆时针旋转90度:三种解法从入门到精通

给定一个方阵,要求将其逆时针旋转90度,并且直接修改原矩阵,不能使用额外的矩阵空间(除了少数临时变量)。

示例:

输入:

复制代码
1 2 3
4 5 6
7 8 9

输出:

复制代码
3 6 9
2 5 8
1 4 7

输入:

复制代码
1  2  3  4
5  6  7  8
9 10 11 12
13 14 15 16

输出:

复制代码
4 8 12 16
3 7 11 15
2 6 10 14
1 5  9 13

目录


方法一:使用额外空间(朴素解法)

思路很简单:创建一个新的矩阵,然后根据旋转公式 res[n-j-1][i] = mat[i][j] 将原矩阵的元素放到新矩阵中,最后将新矩阵拷贝回原矩阵。

时间复杂度:O(n²)

空间复杂度:O(n²)

代码示例(Python):

python 复制代码
def rotateMatrix(mat):
    n = len(mat)
    res = [[0] * n for _ in range(n)]

    for i in range(n):
        for j in range(n):
            res[n - j - 1][i] = mat[i][j]

    for i in range(n):
        for j in range(n):
            mat[i][j] = res[i][j]

学习矩阵旋转,光看静态代码很难理解空间变化。推荐一个神器------图码 ,它提供60多种算法交互式动画,输入自定义矩阵数据就能直观看到每一步旋转过程,还支持粘贴C/C++/Java/Python代码自动生成可视化。专门针对408考研数据结构期末考试 设计,每个知识点都有详细解析。刷题时遇到卡点,随时选中代码调用7×24小时AI解释。点这里体验:图码

图码-数据结构与算法交互式可视化平台

访问网站:https://totuma.cn

方法二:原地旋转(循环交换)

这种方法不需要额外空间,直接在原矩阵上通过循环交换元素。

核心思想:将矩阵看作多个嵌套的环(cycles)。对于一个 n×n 的矩阵,有 n/2 个环。每个环上有 4 个元素需要交换位置。

算法步骤:

  1. 从最外层环开始,逐层向内处理
  2. 在每个环中,将四个角上的元素进行交换
  3. 循环直到所有元素都到达正确位置

代码示例(Python):

python 复制代码
def rotateMatrix(mat):
    n = len(mat)

    for i in range(n // 2):
        for j in range(i, n - i - 1):
            temp = mat[i][j]
            mat[i][j] = mat[j][n - 1 - i]
            mat[j][n - 1 - i] = mat[n - 1 - i][n - 1 - j]
            mat[n - 1 - i][n - 1 - j] = mat[n - 1 - j][i]
            mat[n - 1 - j][i] = temp

时间复杂度:O(n²)

空间复杂度:O(1)


方法三:先反转行再转置

这个方法最巧妙!

逆时针旋转90度 = 先反转每一行,再转置矩阵。

为什么这样可行?因为反转行后,原来第一行的元素会变成最后一行的逆序,再转置后,它们就到了第一列,正好是逆时针旋转的效果。

代码示例(Python):

python 复制代码
def rotateMatrix(mat):
    n = len(mat)

    # 反转每一行
    for row in mat:
        row.reverse()

    # 转置矩阵
    for i in range(n):
        for j in range(i + 1, n):
            mat[i][j], mat[j][i] = mat[j][i], mat[i][j]

时间复杂度:O(n²)

空间复杂度:O(1)


总结

方法 时间复杂度 空间复杂度 特点
朴素解法 O(n²) O(n²) 简单直观,但占用额外空间
循环交换 O(n²) O(1) 原地操作,需要理解环的概念
反转+转置 O(n²) O(1) 最优雅,代码最简洁

如果面试中遇到这个问题,建议先讲朴素解法,再优化到原地旋转,最后可以展示反转+转置的巧妙方法。这样能体现出你对问题理解的深度!

希望这篇文章对你有帮助,欢迎点赞收藏~

相关推荐
小肝一下2 分钟前
3. 单链表
c语言·数据结构·c++·算法·leetcode·链表·dijkstra
劈星斩月9 分钟前
监督学习算法 之 决策树
学习·算法·决策树
卷无止境10 分钟前
Python 异常处理:从入门到工程实践
后端·python
garuda herb13 分钟前
生成专题页Blog--建立并返回 MySQL 数据库连接
python·mysql
学计算机的计算基14 分钟前
操作系统内存管理全解:虚拟内存、页表、COW、malloc、OOM一篇搞定
java·笔记·算法
ONE_SIX_MIX17 分钟前
qwenpaw-plugin-file-tools QwenPaw增强文件工具 更新 v1.1.1
python·qwenpaw
tachibana218 分钟前
hot100 前 K 个高频元素(347)
java·数据结构·算法·leetcode
AOwhisky20 分钟前
Python 学习笔记(第五期)——组合数据类型:列表、元组、集合与字典精讲——核心知识点自测与详解
开发语言·笔记·python·学习·云计算
程序员爱钓鱼28 分钟前
Go 开发环境安装(Windows、macOS、Linux)
后端·面试·go
码农学院39 分钟前
GEO与SEO协同:从传统搜索到生成式搜索的平滑迁移路径
服务器·前端·python