推荐从右上角出发,因该位置是行最大、列最小值,每次比较可排除整行或整列;递归函数以坐标和边界为参数,越界返回false,否则按大小关系单向移动;左上/左下起点无法高效排除行列。

可以直接从二维数组的特定边界位置出发,利用行列递增的规律,每次比较后只向一个方向收缩搜索范围,避免全遍历。关键在于选对起点和移动逻辑。
推荐起点:右上角
右上角元素是所在行最大值、所在列最小值。与目标值比较后,能明确排除一整行或一整列:
- 若当前值等于目标值,查找成功
- 若当前值大于目标值,说明目标不可能在这一列(该列所有下方元素都更大),向左移动一列
- 若当前值小于目标值,说明目标不可能在这一行(该行所有右侧元素都更小),向下移动一行
递归函数设计要点
定义递归函数 find(target, array, row, col, rows, cols),参数包括当前坐标和数组边界:
- 基础情况:row 超出下界(≥ rows)或 col 超出左界(< 0),返回 false
- 取 array[row][col] 与 target 比较,按上述规则决定下一步调用自身的位置
- 每次递归只改变 row 或 col 中的一个,保证路径单调、不重复、不遗漏
为什么不从左上或左下开始?
左上角是全局最小,比较后只能排除自身,无法确定行或列是否整体无效;左下角是列最大、行最小,但向右或向上移动时可能回退,容易陷入循环或漏判。右上角和左下角是对称可行的,但右上角更符合人阅读习惯,代码也更直观。
简单示例走查
数组为:
[[1, 4, 7, 11],
[2, 5, 8, 12],
[3, 6, 9, 16],
[10, 13, 14, 17]]
查 target = 5:
- 起点 (0,3) = 11 > 5 → 向左到 (0,2) = 7 > 5 → 向左到 (0,1) = 4 < 5 → 向下到 (1,1) = 5 → 找到











