题目链接
思路:
由于所给矩阵每一行按升序排列,且每一行的第一个数大于前一行的最后一个数,所以我们可以通过判断目标数与每一行最后一个数的大小来判断这个数可能存在的行号。
确定了行号之后,我们利用二分查找方法在此行中进行对目标数的查找即可。
public boolean searchMatrix(int[][] matrix, int target) {
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return false;
}
// 目标可能存在的行号
int targetRow = 0;
// 每一行的最后一个数
int j = matrix[0].length - 1;
// 从上到下依次遍历
for (int i = 0; i < matrix.length - 1; i++) {
// 若目标值小于当前行的最后一个数,则说明目标值若存在则只能在此行中
if (target <= matrix[i][j]) {
targetRow = i;
break;
// 若目标值比当前行最后一个值大,但比下一行的最后一个值小,
// 则说明目标值若存在则只能出现在下一行中。
} else if (target > matrix[i][j] && target <= matrix[i + 1][j]) {
targetRow = i + 1;
break;
}
}
// 在已确定的行中进行二分查找
int left = 0, right = j;
while (left <= right) {
int mid = (left + right) / 2;
if (matrix[targetRow][mid] == target) {
return true;
} else if (matrix[targetRow][mid] < target) {
left++;
} else {
right--;
}
}
return false;
}