题目:74. 搜索二维矩阵
题目描述
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。
方式一:简单做法暴力破解
public boolean searchMatrix(int[][] matrix, int target) {
if (matrix == null) {
return false;
}
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[i].length; j++) {
if (matrix[i][j] == target) {
return true;
}
}
}
return false;
}
方式二:夹逼法不断缩小范围
由题意可以知道改矩阵是排序好的矩阵,所以可以通过 夹逼法 来不断缩小范围,在进行查找
public boolean searchMatrix(int[][] matrix, int target) {
if (matrix == null) {
return false;
}
//定义函数
int row = matrix.length;
for (int i = 0; i < row; ) {
//定义列数
int col = matrix[i].length;
//锁定行范围
if (matrix[i][col - 1] >= target) {
//遍历所在行,查找元素
for (int j = 0; j < col; ) {
if (matrix[i][j] < target) {
j++;
} else if (matrix[i][j] == target) {
return true;
} else {
return false;
}
}
} else {
i++;
}
}
return false;
}
方式三:二分查找,排序好的数组,使用二分查找效率最高
public boolean searchMatrix(int[][] matrix, int target) {
if (matrix == null) {
return false;
}
//定义行数
int row = matrix.length;
for (int i = 0; i < row; i++) {
int col = matrix[i].length;
//锁定范围,进行二分查找(二分查找的前提,必须是有序的)
if (matrix[i][col - 1] >= target) {
int begin = 0;
int end = col - 1;
int mid = 0;
while (begin <= end) {
mid = (begin + end) >> 1;
if (matrix[i][mid] < target) {
begin = mid + 1;
} else if (matrix[i][mid] == target) {
return true;
} else {
end = mid - 1;
}
}
}
}
return false;
}
努力奔跑,是为了追上曾经被寄予厚望的自己。