二维数组搜索核心是遍历比对目标值,基础用双层for循环;按行有序时可从右上角开始优化至o(m+n);应封装为可复用方法并处理空数组、不规则行列等边界情况。

二维数组在 Java 中常用于模拟表格、矩阵或网格结构,实现数据搜索时,核心思路是遍历所有元素并比对目标值。关键在于明确搜索范围、处理边界条件,并根据需求决定是否提前终止或返回全部匹配位置。
基础线性遍历搜索
最直观的方式是用双层 for 循环逐行逐列检查每个元素。适用于未排序或无需特定顺序的二维数组。
- 外层循环控制行索引(i),内层控制列索引(j)
- 每次比较 array[i][j] == target,成立则可返回坐标或记录结果
- 若只需判断是否存在,匹配成功即可用 return true 提前退出
- 注意数组为空或某行长度为 0 的情况,避免 NullPointerException 或 ArrayIndexOutOfBoundsException
按行有序时的优化搜索(类似“从右上角开始”)
当二维数组每行从左到右递增、每列从上到下递增(如 LeetCode 240 题场景),可避开全遍历,将时间复杂度降至 O(m + n)。
- 起始点选在右上角(row = 0, col = array[0].length - 1)
- 若当前值等于目标,返回 true;大于目标则左移(col--);小于目标则下移(row++)
- 移动边界为 row = 0,越界即搜索失败
- 该策略不依赖整数组全局有序,仅需行列单调性即可生效
封装可复用的搜索方法
把搜索逻辑提取为静态方法,支持泛型或基本类型,增强代码复用性与可读性。
- 方法签名示例:public static int[] search(int[][] matrix, int target)
- 返回 int[2] 表示 [行, 列],未找到返回 null 或 new int[]{-1, -1}
- 支持传入自定义比较逻辑(如用 BiPredicate 处理对象数组)
- 添加参数控制是否查找首个/所有匹配项,例如 boolean findAll
处理常见陷阱与调试建议
实际编码中容易忽略维度不一致、空引用或逻辑短路等问题,调试时重点关注这几处。
- 检查 matrix != null && matrix.length > 0,再访问 matrix[0]
- 每行长度可能不同(不规则数组),内层循环上限应为 matrix[i].length,而非固定值
- 使用 System.out.println("i=" + i + ", j=" + j + ", val=" + matrix[i][j]) 快速验证遍历路径
- 单元测试至少覆盖:空数组、单行、单列、目标在角落、目标不存在等边界用例
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











