LeetCode 搜索二维矩阵
搜索二维矩阵是一道比较经典的算法题,其主要考察的是对数组和二分查找的理解与应用。本文将会从以下几个方面,一步步剖析这道题目。
题目描述
给定一个二维矩阵,每一行都按照升序排列,每一列也按照升序排列。现在给出一个目标值,你要写一个函数来判断这个目标值是否在这个矩阵中。
例如,我们有一个二维矩阵如下:
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]
]
我们要查找的目标值为 5。那么,调用我们的函数后应该返回 true,因为矩阵中存在这个数。
解题思路
要解决这道题目,我们需要先了解一个很重要的性质——二维矩阵的某个位置有一个上界和一个下界。对于当前位置 (i,j),可以将其与矩阵的四个角落比较大小,定义上下界的值:
- 上界:位于
(0,j)的元素。 - 下界:位于
(i, n-1)的元素。
其中,n 是矩阵当前行的长度。
我们可以利用上下界这个性质,来优化搜索。首先,我们考虑从矩阵的右上角出发,依次朝左或者下前进,如果遇到比目标值小的元素,则继续朝下前进;如果遇到比目标值大的元素,则继续朝左前进。如果找到了目标值,就返回 true。如果走出了矩阵,就表示找不到这个目标值,返回 false。
特别地,如果当前矩阵为空,返回 false。
接下来,我们用代码实现这个思路:
public class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
// 如果矩阵为空,返回 false
return false;
}
int n = matrix[0].length;
int i = 0, j = n - 1;
while (i < matrix.length && j >= 0) {
if (matrix[i][j] == target) {
return true;
} else if (matrix[i][j] < target) {
i++;
} else {
j--;
}
}
return false;
}
}
时间复杂度分析
由于我们每次可以排除一行或者一列,因此最多执行 次查找操作。所以,它的时间复杂度为 ,其中 和 分别是矩阵的行数和列数。
空间复杂度分析
由于我们只需要用到若干个变量,所以它的空间复杂度为 。
总结
搜索二维矩阵是一道比较经典的算法题,它主要考察了对二维数组和二分查找的理解和应用。在实际编码过程中,我们可以利用二维数组的性质,优化算法的复杂度,减少不必要的遍历。