二维数组遍历需依问题类型设计:搜索目标值重定位,可用暴力枚举或杨氏矩阵双指针优化;路径探索重连通与回溯,需方向偏移、visited标记及回溯机制。

二维数组遍历不是单纯“套两层 for”,而是要结合坐标思维、状态控制和问题类型做针对性设计。搜索目标值和寻找可行路径,虽然都用遍历,但逻辑重心完全不同:前者重定位,后者重连通与回溯。
按坐标定位目标值:从暴力到有序优化
在无序二维数组中找某个数,最直接的方式是双重循环枚举所有 (i, j) 坐标:
- 逐行扫描,每行内逐列比对,匹配即返回 (i, j)
- 可封装为函数,找到第一个就终止,避免全量遍历
- 若需找全部位置(如统计某数字出现次数),则不 break,改用列表收集 (i, j)
当数组满足“每行递增、每列递增”(杨氏矩阵)时,可升级为双指针法:从右上角出发,当前值大于目标就左移(j--),小于目标就下移(i++),每次排除一行或一列,时间复杂度降至 O(m + n)。
用 DFS 实现路径探索:坐标+方向+回溯三要素
路径类问题(如迷宫通路、连通区域、是否存在环)本质是图的遍历,坐标只是节点标识。关键不在“怎么访问”,而在“怎么走”和“怎么退”:
- 定义四个方向偏移量:[[−1,0],[1,0],[0,−1],[0,1]],代表上下左右
- 用布尔型 visited 数组标记已入栈/已访问的坐标,防止重复进入死循环
- 每次递归前标记 (x, y),递归返回后取消标记(回溯),以便其他路径复用该点
- 合法性校验必须前置:检查 i ∈ [0, m)、j ∈ [0, n),再检查是否可通行、未访问
坐标遍历的实用细节提醒
不同语言处理坐标的惯性不同,容易踩坑:
- Python 推荐用 enumerate() 替代 range(len()),代码更清晰且不易越界
- C/Java 中二维数组若行长度不等(“锯齿数组”),不能直接用 arr[i][j] 配固定列长,需动态查每行 len(arr[i])
- JavaScript 没有原生二维数组类型,arr[i] && arr[i][j] 要加空值防护,尤其处理稀疏结构时
- 所有语言中,修改坐标变量时建议用新变量(如 ni = i + dx),避免原变量被意外覆盖影响后续分支
坐标是入口,逻辑是骨架,遍历方式只是工具。真正决定成败的是:你想解决的是“在哪里”——还是“怎么去”。

















