矩阵——搜索二维矩阵II
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:
每行的元素从左到右升序排列。
每列的元素从上到下升序排列。
这道题的核心是利用矩阵的有序特性,避开暴力算法,实现O(m+n)时间复杂度的高效搜索(m为行数,n为列数),空间复杂度为O(1).
解题思路:
矩阵特性:每行升序、每列升序。
最优策略:从矩阵的右上角开始搜索(也可以选左下角),利用大小关系每次排除一行或一列:
- 右上角元素是当前行最大、当前列最小的值;
- 如果当前值==目标值:找到目标,返回true;
- 如果当前值>目标值,目标一定在当前列左侧,列数减一;
- 如果当前值<目标值:目标一定在当前行下方,行数加一;
- 越界仍未找到:返回false。
完整代码实现如下:
#include
#include
using namespace std;
class Solution {
public:
bool searchMatrix(vector<vector
// 边界判断:矩阵为空直接返回
if (matrix.empty() || matrix[0].empty()) {
return false;
}
int rows = matrix.size(); // 矩阵行数
int cols = matrix[0].size(); // 矩阵列数
// 初始位置:右上角 (第0行,最后一列)
int row = 0;
int col = cols - 1;
// 循环条件:不越界
while (row < rows && col >= 0) {
if (matrix[row][col] == target) {
// 找到目标值
return true;
} else if (matrix[row][col] > target) {
// 当前值太大,向左移动一列
col--;
} else {
// 当前值太小,向下移动一行
row++;
}
}
// 遍历完未找到
return false;
}
};
// 测试代码
int main() {
vector<vector
{1, 4, 7, 11, 15},
{2, 5, 8, 12, 19},
{3, 6, 9, 16, 22},
{10, 13, 14, 17, 24},
{18, 21, 23, 26, 30}
};
Solution sol;
int target1 = 5; // 存在
int target2 = 20; // 不存在
cout << boolalpha; // 输出 true/false 而非 1/0
cout << "搜索 " << target1 << ": " << sol.searchMatrix(matrix, target1) << endl;
cout << "搜索 " << target2 << ": " << sol.searchMatrix(matrix, target2) << endl;
return 0;
}
代码核心解释:
- 边界处理:先判断矩阵是否为空,避免访问越界;
- 初始定位:从右上角 matrix[0][cols-1] 开始搜索;
- 循环逻辑:
- 相等:直接返回结果;
- 过大:左移(排除当前列);
- 过小:下移(排除当前行);
4.终止条件:行 / 列索引越界,说明无目标值。
复杂度分析
- 时间复杂度:O (m + n),最多遍历 m 行 + n 列;
- 空间复杂度:O (1),仅使用了几个临时变量,无额外空间开销。
总结
- 最优起点:右上角 / 左下角,利用有序性每次排除一行 / 一列;
- 效率远高于暴力遍历(O (mn));
- 代码简洁、无额外空间,是这道题的标准最优解。
浙公网安备 33010602011771号