返回
纵横捭阖,探秘二维矩阵的寻宝之旅
后端
2023-10-06 02:03:56
在计算机科学的广阔海洋中,算法题猶如散落的珍珠,等待着我们去发现和探索。今天,我们将潜入一道经典算法题的深海——搜索二维矩阵。这是一道考察二分搜索和矩阵遍历技巧的题型,让我们一同踏上这段寻宝之旅,揭开二维矩阵的神秘面纱。
问题陈述:
给定一个由整数组成的二维矩阵 matrix
和一个目标值 target
,判断 target
是否存在于 matrix
中。matrix
满足以下条件:
- 每一行中的整数从左到右是递增的。
- 每一列中的整数从上到下是递增的。
解决方案:
直面这道算法题,我们可以从两个维度来思考解决思路。首先,我们观察矩阵的递增特性,可以发现它与二分搜索有异曲同工之处。对于每一行,我们可以通过二分搜索快速找到 target
的位置。
其次,我们再考虑矩阵的逐行递增性质。如果 target
比当前行的最小值小,那么它肯定不会出现在当前行中,我们可以直接跳过该行。同样的,如果 target
比当前行的最大值大,那么它也不会出现在当前行中。
基于这两个思路,我们可以设计一个巧妙的算法:
- 初始化行指针
row
为0
,列指针col
为matrix
的最后一列。 - 如果
target
小于matrix[row][col]
,则跳过当前行,row
加 1。 - 如果
target
大于matrix[row][col]
,则跳过当前列,col
减 1。 - 如果
target
等于matrix[row][col]
,则返回true
,表示找到target
。 - 如果
row
大于等于矩阵行数或col
小于 0,则返回false
,表示未找到target
。 - 重复步骤 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)
,其中 m
和 n
分别表示矩阵的行数和列数。这是因为我们在最坏情况下需要遍历矩阵的每一行和每一列。
空间复杂度:
该算法的空间复杂度为 O(1)
,因为我们仅使用几个指针变量来跟踪矩阵中的位置。
总结:
搜索二维矩阵算法融合了二分搜索和矩阵遍历技巧,通过巧妙地利用矩阵的递增特性,我们可以高效地找到目标值 target
。这道算法题既考验我们的算法设计能力,也启发我们思考如何将不同技术组合起来解决实际问题。
附录: