问题描述
给定一个m x n
的二维矩阵,其中:
- 每行的元素从左到右升序排列
- 每列的元素从上到下升序排列
要求编写一个高效的算法来搜索矩阵中是否存在目标值target
。


解法一:暴力搜索(基础版)
最直观的解法是遍历整个矩阵:
javascript
function searchMatrix(matrix, target) {
for (let i = 0; i < matrix.length; i++) {
for (let j = 0; j < matrix[0].length; j++) {
if (matrix[i][j] === target) {
return true;
}
}
}
return false;
}
复杂度分析:
- 时间复杂度:O(m×n) - 需要遍历所有元素
- 空间复杂度:O(1) - 只使用了常数空间
优点:
- 实现简单直观
- 适用于任何矩阵,不依赖排序特性
缺点:
- 效率太低,完全没有利用矩阵有序的特性
解法二:最优解法 - 步进搜索
利用行列都有序的特性,可以从矩阵右上角开始搜索:
javascript
function searchMatrix(matrix, target) {
if (!matrix.length || !matrix[0].length) return false;
const m = matrix.length;
const n = matrix[0].length;
let row = 0, col = n - 1; // 从右上角开始
while (row < m && col >= 0) {
const current = matrix[row][col];
if (current === target) {
return true;
}
if (current > target) {
col--; // 目标值在当前行的左侧,左移一列
} else {
row++; // 目标值在当前列的下方,下移一行
}
}
return false;
}
复杂度分析:
- 时间复杂度:O(m + n) - 最多移动m+n次
- 空间复杂度:O(1) - 只使用了常数空间
复杂度对比
以下是两种方法的对比图示化呈现,结合图表和可视化路径说明:
方法对比图表
barChart
title 时间复杂度对比(越小越好)
x-axis 方法
y-axis 时间复杂度
series
"暴力搜索": 25
"步进搜索": 5
colors ["#FF6384"]
pie
title 空间复杂度对比
"O(1)": 100
搜索路径可视化
1. 暴力搜索(全矩阵扫描)
plaintext
遍历顺序:
(0,0)→(0,1)→(0,2)→...→(0,n-1)
↓
(1,0)→(1,1)→...→(1,n-1)
↓
...
↓
(m-1,0)→...→(m-1,n-1)
特点:必须检查所有m×n个元素
2. 步进搜索(右上角起点)
以搜索target=5
为例:
plaintext
矩阵示例:
[ 1, 4, 7, 11, 15] → 初始点(0,4)=15
[ 2, 5, 8, 12, 19] → 15>5 → 左移
[ 3, 6, 9, 16, 22] → 11>5 → 左移
[10, 13, 14, 17, 24] → 7>5 → 左移
[18, 21, 23, 26, 30] → 4<5 → 下移
→ (1,1)=5 ✔
搜索路径:
(0,4)→(0,3)→(0,2)→(0,1)→(1,1)
特点:最多移动m+n步(本例5步)
性能对比说明
维度 | 暴力搜索 | 步进搜索 |
---|---|---|
搜索路径 | 必须遍历所有元素 | 锯齿形路径排除行列 |
最佳情况 | 仍需O(m×n) | 可能首元素即命中(O(1)) |
最差情况 | 必须完成全部遍历 | 走满m+n步 |
适用场景 | 无序矩阵 | 行列有序矩阵 |
直观效率对比
假设矩阵为5×5(m=n=5):
- 暴力搜索:必须检查25个元素
- 步进搜索:最多检查5+5-1=9个元素(对角线路径)
plaintext
步进搜索最大检查次数 = m + n - 1
暴力搜索检查次数 = m × n
边界情况处理
-
空矩阵检查:
javascriptif (!matrix.length || !matrix[0].length) return false;
-
快速失败检查:
javascriptconst min = matrix[0][0]; const max = matrix[m-1][n-1]; if (target < min || target > max) return false;
实际应用场景
这种算法适用于:
- 游戏地图中的高效搜索
- 图像处理中的像素查找
- 电子表格数据查询
- 任何行列有序的二维数据搜索
总结与建议
- 优先选择步进搜索:利用矩阵特性达到最优时间复杂度
- 注意边界条件:空矩阵和极值检查能提高鲁棒性
- 理解算法本质:每次比较排除一行或一列是关键
掌握这种高效的搜索策略,能够帮助你在处理有序二维数据时游刃有余!