不规则二维数组是贴合现实数据形态的自然选择,如杨辉三角、稀疏矩阵、树层序遍历、DP状态表等均天然适配:逐行动态分配长度,按需存储,避免空间浪费,遍历时须以每行实际长度为界。

不规则二维数组在算法题中不是“特殊技巧”,而是贴合现实数据形态的自然选择。它不追求整齐划一,反而更真实——比如杨辉三角、稀疏矩阵、树形结构的层序表示、动态规划中的状态压缩表等,都天然适合用不规则数组建模。
杨辉三角:最典型的不规则数组建模
杨辉三角第n行有n+1个元素,行长度逐行递增。用规则二维数组会浪费大量空间(如申请100×100数组只用一半),而用不规则数组可精准匹配:
- 先声明
int[][] triangle = new int[n][]; - 再逐行初始化:
triangle[i] = new int[i + 1]; - 填值时只需判断边界:
if (j == 0 || j == i) triangle[i][j] = 1;,否则triangle[i][j] = triangle[i-1][j-1] + triangle[i-1][j];
树的层序遍历结果存储
二叉树按层遍历(BFS)后,每层节点数不确定——满二叉树呈指数增长,但实际树可能左倾或右倾。将每层节点存入一个一维数组,再把所有层数组组合成二维数组,就是标准不规则结构:
-
List<List<Integer>>是逻辑等价结构,但算法题常要求返回int[][] - 需先统计每层节点数,再分配每行长度,最后填值
- 遍历时不能假设
result[i].length == result[0].length,必须用result[i].length作内层循环上限
动态规划中的非对称状态表
某些DP问题的状态维度不统一。例如“单词拆分II”中,dp[i] 存储所有能组成前i个字符的句子列表,不同i对应的句子数量差异极大:
- 可建模为
List<String[]> dp,转为String[][]即为不规则二维数组 - 回溯填充时,每行长度由实际解的数量决定,无法预设列数
- 输出或进一步处理时,必须逐行判空、逐元素访问,跳过null行
稀疏数据的紧凑表示
当二维数据中大量位置为空(如棋盘上仅少数格子有棋子、社交图中仅部分用户有好友关系),用不规则数组替代全量矩阵可显著节省空间和时间:
- 例如:每行存该行所有非零元素的列索引与值对,形成
int[][] sparseRows - 遍历统计时,外层循环行号,内层循环该行实际有效项,避免扫描全列
- 配合哈希或二分查找,还能支持快速列向查询(需额外维护列索引映射)
本质上,不规则二维数组的价值在于“按需分配”和“如实反映结构”。算法题里它常是优化空间复杂度、匹配问题本征形状的关键一步,而不是炫技手段。

















