矩阵——搜索二维矩阵II

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:

每行的元素从左到右升序排列。
每列的元素从上到下升序排列。

这道题的核心是利用矩阵的有序特性,避开暴力算法,实现O(m+n)时间复杂度的高效搜索(m为行数,n为列数),空间复杂度为O(1).

解题思路
矩阵特性:每行升序、每列升序。

最优策略:从矩阵的右上角开始搜索(也可以选左下角),利用大小关系每次排除一行或一列

  1. 右上角元素是当前行最大、当前列最小的值;
  2. 如果当前值==目标值:找到目标,返回true;
  3. 如果当前值>目标值,目标一定在当前列左侧,列数减一;
  4. 如果当前值<目标值:目标一定在当前行下方,行数加一;
  5. 越界仍未找到:返回false。

完整代码实现如下
#include
#include
using namespace std;

class Solution {
public:

bool searchMatrix(vector<vector>& matrix, int target) {
// 边界判断:矩阵为空直接返回
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> matrix = {
{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;
}

代码核心解释

  1. 边界处理:先判断矩阵是否为空,避免访问越界;
  2. 初始定位:从右上角 matrix[0][cols-1] 开始搜索;
  3. 循环逻辑
  • 相等:直接返回结果;
  • 过大:左移(排除当前列);
  • 过小:下移(排除当前行);
    4.终止条件:行 / 列索引越界,说明无目标值。

复杂度分析

  • 时间复杂度:O (m + n),最多遍历 m 行 + n 列;
  • 空间复杂度:O (1),仅使用了几个临时变量,无额外空间开销。

总结

  1. 最优起点:右上角 / 左下角,利用有序性每次排除一行 / 一列;
  2. 效率远高于暴力遍历(O (mn));
  3. 代码简洁、无额外空间,是这道题的标准最优解。
posted @ 2026-04-01 11:04  ZealousMclaren  阅读(22)  评论(0)    收藏  举报