【LeetCode】74. 搜索二维矩阵
解题思路
该问题要求在一个满足行列双重有序的矩阵中高效查找目标值:
- 行列有序特性:
- 每行元素从左到右非严格递增(允许重复值)
- 每行首元素 > 上一行末元素(整体连续递增)
- 核心思想:
- 将二维矩阵视为一维有序数组(满足条件2保证全局有序)
- 通过二分查找直接定位目标值
- 关键转换:
- 一维索引
idx→ 二维坐标(row, col):row = idx / 列数col = idx % 列数
- 一维索引
此方法时间复杂度为
O(log(mn)),优于行列分别查找的O(mlogn)
关键步骤
- 边界处理:
- 空矩阵直接返回
false - 单元素矩阵直接比较
- 空矩阵直接返回
- 二分查找初始化:
- 左指针
left = 0 - 右指针
right = 行数×列数 - 1
- 左指针
- 索引转换:
- 计算中点
mid = (left + right) / 2 - 行列坐标:
row = mid / n,col = mid % n(n为列数)
- 计算中点
- 比较更新:
matrix[row][col] == target→ 返回truematrix[row][col] < target→left = mid + 1matrix[row][col] > target→right = mid - 1
代码实现
示例测试
复杂度分析
| 指标 | 值 | 说明 |
|---|---|---|
| 时间复杂度 | O(log(mn)) | 二分查找的迭代次数 |
| 空间复杂度 | O(1) | 仅需常数级变量存储指针 |
| 优势场景 | 大规模矩阵 | 100万元素只需约20次比较 |
关键点总结
-
全局有序证明:
- 条件2(每行首元素 > 上一行末元素)确保矩阵整体有序
- 示例:
[1,3,5,7]→[10,...]→[23,...]形成连续序列1,3,5,7,10,11,...
-
索引转换原理:
- 列数
n作为转换基准:row = idx / n // 整数除法自动向下取整 col = idx % n // 取余获得列偏移
- 列数
-
二分查找变体:
- 标准二分查找在一维数组的扩展应用
- 比较时直接使用二维数组元素值
-
边界处理细节:
- 空矩阵检查:避免
cols=0导致的除零错误 - 单元素优化:逻辑已涵盖,无需特殊处理
- 空矩阵检查:避免

浙公网安备 33010602011771号