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

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

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

相关推荐
一只齐刘海的猫9 分钟前
【Leetcode】移动零
算法·leetcode·职场和发展
神奇小汤圆12 分钟前
SEATA:Server 到 Golang Client 全链路走读
面试
超人气王15 分钟前
新手学前端JS浅拷贝和深拷贝:对象复制竟然是个“替身文学”?
javascript·面试
指针战神31 分钟前
synchronized简易版Redis版跳表实现(注释干货)
数据结构
张高兴41 分钟前
张高兴的 Hailo-10 开发指南:(二)使用 LangChain 搭建本地大模型 RAG 问答应用
python·边缘计算·hailo
财经资讯数据_灵砚智能1 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(日间)2026年6月6日
大数据·人工智能·python·ai·信息可视化·自然语言处理·灵砚智能
落羽的落羽1 小时前
【项目】JsonRpc框架——开发实现1(细节功能、字段定义、抽象层、具象层)
linux·服务器·网络·c++·人工智能·算法·机器学习
Aphasia3111 小时前
从内存模型看深浅拷贝
前端·javascript·面试
Land03291 小时前
Python + RPA 双引擎实战:从手写脚本到可交付自动化应用的完整链路
python·自动化·rpa
handler011 小时前
【算法】并查集(普通/扩展/带权)模板与例题
数据结构·c++·笔记·算法·c·图论·查并集