返回

纵横捭阖,探秘二维矩阵的寻宝之旅

后端

在计算机科学的广阔海洋中,算法题猶如散落的珍珠,等待着我们去发现和探索。今天,我们将潜入一道经典算法题的深海——搜索二维矩阵。这是一道考察二分搜索和矩阵遍历技巧的题型,让我们一同踏上这段寻宝之旅,揭开二维矩阵的神秘面纱。

问题陈述:

给定一个由整数组成的二维矩阵 matrix 和一个目标值 target,判断 target 是否存在于 matrix 中。matrix 满足以下条件:

  • 每一行中的整数从左到右是递增的。
  • 每一列中的整数从上到下是递增的。

解决方案:

直面这道算法题,我们可以从两个维度来思考解决思路。首先,我们观察矩阵的递增特性,可以发现它与二分搜索有异曲同工之处。对于每一行,我们可以通过二分搜索快速找到 target 的位置。

其次,我们再考虑矩阵的逐行递增性质。如果 target 比当前行的最小值小,那么它肯定不会出现在当前行中,我们可以直接跳过该行。同样的,如果 target 比当前行的最大值大,那么它也不会出现在当前行中。

基于这两个思路,我们可以设计一个巧妙的算法:

  1. 初始化行指针 row0,列指针 colmatrix 的最后一列。
  2. 如果 target 小于 matrix[row][col],则跳过当前行,row 加 1。
  3. 如果 target 大于 matrix[row][col],则跳过当前列,col 减 1。
  4. 如果 target 等于 matrix[row][col],则返回 true,表示找到 target
  5. 如果 row 大于等于矩阵行数或 col 小于 0,则返回 false,表示未找到 target
  6. 重复步骤 2-5,直到找到 target 或遍历完整个矩阵。

代码示例:

bool searchMatrix(vector<vector<int>>& matrix, int target) {
    int row = 0, col = matrix[0].size() - 1;
    while (row < matrix.size() && col >= 0) {
        if (matrix[row][col] == target) return true;
        else if (matrix[row][col] < target) row++;
        else col--;
    }
    return false;
}

时间复杂度:

该算法的时间复杂度为 O(m + n),其中 mn 分别表示矩阵的行数和列数。这是因为我们在最坏情况下需要遍历矩阵的每一行和每一列。

空间复杂度:

该算法的空间复杂度为 O(1),因为我们仅使用几个指针变量来跟踪矩阵中的位置。

总结:

搜索二维矩阵算法融合了二分搜索和矩阵遍历技巧,通过巧妙地利用矩阵的递增特性,我们可以高效地找到目标值 target。这道算法题既考验我们的算法设计能力,也启发我们思考如何将不同技术组合起来解决实际问题。

附录: