AlgoMooc

矩阵

5 / 28基础内容

数据结构动画

矩阵

加载中
正在加载动画引擎...

本课导读

二维数组就是一张表格,用行、列两个下标定位格子,是棋盘、图、动态规划表的共同载体。

你将学到
  • a[i][j]:先行后列,都从 0 开始
  • 双层循环遍历(行优先)
  • 按列 / 对角线等不同走法

二维数组是什么

二维数组可以看作一个表格,比如 Excel 工作表或教室座位表。它有行和列,每个格子存放一个数据。在编程中,二维数组本质上是数组的数组:一个一维数组,它的每个元素又是一个一维数组。例如 int matrix[3][4] 表示有 3 行、每行有 4 个整数的表格。

行列下标 a[i][j] 与内存布局

要访问第 i 行第 j 列的元素,使用 a[i][j]。下标通常从 0 开始,所以 a[0][0] 是第一个元素。在内存中,二维数组是按行连续存储的:先存第 0 行的所有列,再存第 1 行,以此类推。这种布局使得行内元素在内存中相邻,访问效率高。

遍历方式:行优先/列优先/对角线

  • 行优先:外层循环行 i,内层循环列 j。按行顺序访问,符合内存布局,缓存友好。
  • 列优先:外层循环列 j,内层循环行 i。跳着访问内存,可能引起缓存不命中,效率较低。
  • 对角线:i 和 j 同时变化,如 i=j 的主对角线。常用于矩阵运算。

常见操作复杂度

操作时间复杂度说明
访问 a[i][j]O(1)直接计算地址
修改 a[i][j]O(1)同访问
遍历所有元素O(m×n)m 行 n 列
按行求和O(m×n)需遍历每个元素
矩阵转置O(m×n)需复制到新数组

典型应用:网格/图/DP 表

  • 网格:如棋盘、像素图像、地图,用二维数组表示每个位置的状态。
  • :邻接矩阵表示图中顶点之间的连接关系,graph[i][j] 为 1 表示有边。
  • DP 表:动态规划中常用二维数组存储子问题结果,如背包问题、最长公共子序列。
吴师兄提示:「先行后列」四个字,能省无数 bug。

学完练一练

把刚学的结构放进 LeetCode 题里用一次。

去图解题库实战