二维矩阵搜索需据有序性选策略:行间递增矩阵用全局二分(o(log(mn))),行、列分别升序矩阵用右上角z字形搜索(o(m+n))。

二维数组的矩阵搜索不是简单遍历,关键看矩阵是否具备特定有序性——不同结构对应不同最优策略。
先确认矩阵类型再选方法
两类常见有序结构决定解法走向:
- 行内有序 + 行间严格递增(如 [[1,3,5,7],[10,11,16,20],[23,30,34,60]]):整块矩阵逻辑上等价于一个升序一维数组,适合全局二分查找
- 行内升序 + 列内升序(如 [[1,4,7,11],[2,5,8,12],[3,6,9,16]]):没有全局单调性,但右上/左下角具有“决策锚点”特性,适合Z字形线性搜索
全局二分:把二维当一维用
不真正展开数组,只做坐标映射。索引 mid 对应的二维位置是:
行号 = mid // 列数,列号 = mid % 列数。
边界初始化为 0 和 m×n−1,其余流程和一维二分完全一致。
- 每次比较 matrix[mid//n][mid%n] 与 target
- 小了就往右半段找(left = mid + 1),大了就往左半段找(right = mid − 1)
- 时间复杂度 O(log(mn)),空间 O(1)
Z字形搜索:从右上角出发
利用右上角“本行最大、本列最小”的性质做方向判断:
- 当前值 == target → 找到,返回 true
- 当前值 > target → 该列全大于 target,向左走(col--)
- 当前值
- 越界即失败,全程最多走 m + n 步,时间复杂度 O(m + n)
其他可行但非最优的思路
比如对每行单独二分(O(m log n))、暴力扫描(O(mn))、分治递归(常数大、实现复杂)。实际编码中,优先判断矩阵结构,再套用上述两种主干逻辑即可覆盖绝大多数场景。











