矩阵逆时针旋转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) 最优雅,代码最简洁

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

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

相关推荐
就叫你天选之人啦5 分钟前
安装torch+vllm+flash_attn的prompt
人工智能·pytorch·python
reikocao12 分钟前
大场景下 Hessian 特征值放大与退化检测
算法
hetao173383717 分钟前
2026-09-18 hetao1733837 的刷题记录
c++·算法
wuyk55537 分钟前
21.计数排序:不用比较的“空间换时间”排序算法
python·算法·排序算法
智码看视界38 分钟前
第4篇:循环神经网络及其变体 LSTM/GRU 实战
python·自然语言处理·gru·lstm·循环神经网络·情感分析·梯度消失
Web3&Basketball39 分钟前
Agent外传审计实战:3类失准事故拦截脚本
python·大模型·agent·性能调优·推理优化
船厂电气自动化ai大模型1 小时前
AI大模型与数学|第81天 课程:正交向量、正交基、格拉姆‑施密特(Gram‑Schmidt)正交化
开发语言·数据结构·人工智能·线性代数·机器学习
何以解忧,唯有..1 小时前
Milvus 向量数据库的 DDL、DML、DQL 操作详解
python
Rabitebla1 小时前
【Linux系统编程】 指令(二):一条路径是怎么定位到文件的
linux·c++·笔记·学习·算法
罗狮粉 991 小时前
AI-Gateway — 面向 AI Agent 的本地 Runtime Gateway
人工智能·python·inscode·ai编程