矩阵对角线遍历按i+j=常数分组,k从0到m+n−2,对每个k枚举合法i,j=k−i,确保元素在矩阵范围内。

矩阵对角线遍历是指按对角线方向(从左下到右上,或从右上到左下)依次访问二维数组中所有元素。常见需求包括:打印对角线元素、按对角线顺序生成一维数组、处理图像对角特征等。关键在于发现行索引 i 与列索引 j 在同一条对角线上满足 i + j = 常数(主对角线方向),或 i − j = 常数(副对角线方向)。
按主对角线(i + j 相同)分组遍历
同一主对角线上的元素满足 i + j = k(k 从 0 到 m+n−2)。遍历时可先按 k 分组,再对每组内元素按行递增(即 j = k−i 递减)或列递增顺序排列。
- 对每个 k ∈ [0, m+n−2],枚举合法的 i(i ≥ 0, i
- 若要求“之字形”(Zigzag)遍历(奇数 k 从上到下,偶数 k 从下到上),可在收集完该组后判断 k % 2 决定是否反转
- 例如 matrix = [[1,2,3],[4,5,6],[7,8,9]],k=2 对应 (0,2),(1,1),(2,0),值为 [3,5,7]
用方向向量模拟行走路径
更直观的方式是模拟从起点出发,沿固定方向移动,遇到边界时转向。适用于“之字形对角线遍历”(LeetCode 498)。
- 初始位置为 (0,0),方向向量设为 (-1,1)(向上右)
- 每次尝试移动:new_i = i + di, new_j = j + dj;若越界(new_i
- 越界处理策略:若从上边/右边越出,下一个起点为 (i+1, j);若从左边/下边越出,则为 (i, j+1)
避免重复与遗漏的索引控制技巧
手动枚举易错在边界条件。推荐统一用双循环:外层控制对角线索引 k,内层用 while 或 for 枚举有效 (i,j) 对。
- 对于 m×n 矩阵,k 范围是 0 到 m+n−2
- i 的起始值为 max(0, k−n+1),终止值为 min(k, m−1),j = k−i 自动落在 [0,n) 内
- 这样能自然覆盖所有元素,无需额外判重或跳过
Python 实现示例(主对角线之字形)
以下代码输出 [[1,2,3],[4,5,6],[7,8,9]] 的对角线之字遍历结果 [1,2,4,7,5,3,6,8,9]:
def findDiagonalOrder(mat):
if not mat or not mat[0]: return []
m, n = len(mat), len(mat[0])
res = []
for k in range(m + n - 1):
diag = []
i = max(0, k - n + 1)
while i











