矩阵逆时针旋转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 分钟前
[Python] 模 n 乘法的逆元计算器
python·数学·游戏
aqi0026 分钟前
15天学会AI应用开发(十)把文本嵌入模型换成国产模型
人工智能·python·ai编程
_清歌2 小时前
DSpark 深度解读:DeepSeek-V4 如何用「半自回归」把推理速度提升 85%
算法
统计实现局2 小时前
SVD 的三步走:双对角化、Givens 收敛、排序
算法
躬行见万象2 小时前
《VLA 系列》UniLab 强化训练 | G1 机器人 |复现
算法
统计实现局2 小时前
对称不定分解(Bunch-Kaufman):为什么 Cholesky 不够用
算法
统计实现局2 小时前
dqrsl 拆解:拿着 QR 结果能算出哪 5 种东西
算法
程序员七平3 小时前
面试官:你说你Vibe Coding手拿把掐,那 Claude Code 用户级、项目级、本地级配置怎么隔离?
面试