矩阵逆时针旋转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就业方向全解析:后端、爬虫、数据分析、AI你选哪个?
python·学习·架构·教程·面向对象·项目
在世修行2 小时前
智学文枢:题目流水线
python·多线程·状态机·pyside
梯度下降者3 小时前
零基础入门Python 爬虫
爬虫·python·数据分析·入门指南·webcrawler
Yuzhiyuxia4 小时前
【AI Agent面试系列】AI Agent记忆机制知识点1
人工智能·面试·职场和发展
UIU1144 小时前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
“AI国潮设计-小江”4 小时前
【AIGC实战】Python+Stable Diffusion打造“英歌舞财神”IP,解锁“马到成功”等爆款情绪营销文案设计
开发语言·人工智能·python·prompt·aigc
论文复现现场4 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
ZhengEnCi4 小时前
用 AI 写代码为什么拼到最后还是拼人:算力瓶颈与领域专家提示词的本质差异
算法·架构
benchmark_cc5 小时前
用 Python 拉 A 股全市场实时快照:Notebook 请求、结果校验与易错点
python·数据分析·pandas·量化交易·股票数据·quantdash
伞伞悦读5 小时前
【第70期】Adam二阶矩不是方差:偏差校正、动量与AdamW完整实验
python