矩阵对角线遍历:从暴力到最优的优雅解法

刷题的时候遇到一个很有意思的矩阵遍历问题------对角线遍历。给定一个 n*n 的二维矩阵,要求按照特定的对角线顺序打印所有元素。

先来看看两个例子:

示例1: n = 2

复制代码
[[1, 2],
 [3, 4]]

输出:[1, 2, 3, 4]

示例2: n = 3

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

输出:[1, 2, 4, 3, 5, 7, 6, 8, 9]

看到这个输出,有没有发现规律?其实就是按照从左上到右下的对角线方向,依次遍历所有的元素。

两种解法,让你彻底搞懂

方法一:暴力解法(O(n²) 时间,O(n²) 空间)

核心思路:利用 i + j 的值来分组。因为在同一对角线上的元素,它们的 i + j 值相等。

我们可以创建一个临时数组,把相同 i + j 值的元素放在一起,最后再按顺序输出。

python 复制代码
def diagonalTraversal(mat):
    n = len(mat)
    diag = [[] for _ in range(2 * n - 1)]

    # 存储对角线上的元素
    for i in range(n):
        for j in range(n):
            diag[i + j].append(mat[i][j])

    # 打印结果
    for d in range(2 * n - 1):
        for val in diag[d]:
            print(val, end=" ")

输出:1 2 4 3 5 7 6 8 9

这种方法简单直观,但需要额外的 O(n²) 空间来存储对角线元素。

学完矩阵对角线遍历的暴力解法,是不是觉得代码写起来有点绕?其实这类二维数组的遍历技巧,背后藏着很多优雅的规律。最近发现一个叫图码的宝藏网站,它把60多种数据结构和算法做成交互动画,你输入自定义数据或上传C/C++/Java/Python代码,就能看到每一步的解析。对于408考研和高校《数据结构》期末考试复习特别友好,7x24小时AI还能随时解释代码逻辑。刷题卡壳时,不如去图码看看动画,理解会通透很多。

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

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

方法二:最优解法(O(n²) 时间,O(1) 空间)

有没有更优雅的方式?当然有!我们可以直接遍历每条对角线,不需要额外空间。

思路是这样的:

  1. 先遍历第一行的每个元素作为起点,沿着对角线(向下向左)打印
  2. 再遍历最后一列的每个元素(除了第一个)作为起点,同样沿着对角线打印
python 复制代码
def diagonalTraversal(mat):
    n = len(mat)

    # 从第一行开始
    for col in range(n):
        i, j = 0, col
        while i < n and j >= 0:
            print(mat[i][j], end=" ")
            i += 1
            j -= 1

    # 从最后一列开始(排除第一行)
    for row in range(1, n):
        i, j = row, n - 1
        while i < n and j >= 0:
            print(mat[i][j], end=" ")
            i += 1
            j -= 1

输出:1 2 4 3 5 7 6 8 9

复杂度分析

方法 时间复杂度 空间复杂度
暴力法 O(n²) O(n²)
最优法 O(n²) O(1)

总结

这个问题的关键在于发现对角线上元素 i + j 为常数的规律。暴力解法虽然容易理解,但最优解法的直接遍历更符合"优雅"二字------不需要额外空间,逻辑清晰,代码简洁。

下次遇到矩阵遍历问题,不妨先想想对角线的特性,也许就能找到更优的解法!

相关推荐
Gigavision3 小时前
基于BUAA-MIHR数据集的噪声解耦对比学习算法
人工智能·python·深度学习·算法
鹿角片ljp3 小时前
LeetCode 64:最小路径和复盘|二维 DP 与 ACM 模式完整写法
java·数据结构·算法
彧azz4 小时前
算法设计与分析:贪心与动态规划
数据结构·学习·算法·贪心算法·动态规划
Beyond_System|系统之外5 小时前
【学编程】Python基础编程题100道(21-60)
开发语言·python·算法
景熙55236 小时前
15.Java 8 Stream 流入门到实战
java·开发语言·数据结构
俗人六哥AI企业获客盈利系统7 小时前
知识库才是AI落地的分水岭
人工智能·线性代数·矩阵·自动化
漂流瓶jz7 小时前
UVA-1442 洞穴 题解答案代码 算法竞赛入门经典第二版
c++·算法·题解·aoapc·算法竞赛入门经典·uva
叠层归一研究院8 小时前
基于极限自指的叠层归一宇宙结构理论——无元外部封闭系统的内生区分模型
人工智能·经验分享·算法·agi
Selvaggia9 小时前
Diffusion Model 的基本原理与模型架构
算法
wabs66611 小时前
关于二叉树【力扣572.另一棵树的子树的思考】
数据结构·c++·算法·leetcode·二叉树