力扣 - 74. 搜索二维矩阵
题目
思路1(暴力)
- 遍历二维数组的所有的元素,看看是否存在target
代码
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[0].length; j++) {
if (matrix[i][j] == target) {
return true;
}
}
}
return false;
}
}
复杂度分析
- 时间复杂度:\(O(N^2)\),其中 N 为数组长度
- 空间复杂度:\(O(1)\)
思路2(二分法1)
- 先找出在哪一行
- 然后再在那一行进行二分查找,找到目标数字返回true,否则返回false
代码
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if (matrix.length == 0 || matrix[0].length == 0) {
return false;
}
int flag = matrix.length - 1;
for (int i = matrix.length - 1; i >= 0; i--) {
if (matrix[i][0] <= target) {
flag = i;
break;
}
}
int left = 0;
int right = matrix[0].length - 1;
while (left <= right) {
int mid = left + ((right - left) / 2);
if (target < matrix[flag][mid]) {
right = mid - 1;
} else if (target > matrix[flag][mid]) {
left = mid + 1;
} else {
return true;
}
}
return false;
}
}
复杂度分析
- 时间复杂度:\(O(N)\),其中 N 为数组长度
- 空间复杂度:\(O(1)\)
思路3(二分法2)
- 因为二维数组从上到下从左到右是递增的,我们可以将m*n的二维数组看成长度是m*n的升序数字
- 对该升序的数字,我们再利用二分查找进行查找
- 将升序的索引转换为二维数组的行和列的索引如下:
- row:mid / martix[0].length
- col:mid % martix[0].length
代码
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if (matrix.length == 0) {
return false;
}
int x = matrix.length;
int y = matrix[0].length;
int left = 0;
int right = x * y - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
// 求行
int row = mid / y;
// 求列
int col = mid % y;
if (matrix[row][col] < target) {
left = mid + 1;
} else if (matrix[row][col] > target) {
right = mid - 1;
} else {
return true;
}
}
return false;
}
}
复杂度分析
- 时间复杂度:\(O(logM*N)\),其中 M、N 为数组长度
- 空间复杂度:\(O(1)\)
我走得很慢,但我从不后退!

浙公网安备 33010602011771号