二维二分搜索法(代码实现的过于复杂了,改日优化一下)
此题对于二分法模板的提炼是不错的
public boolean searchMatrix(int[][] matrix, int target) {
if (matrix.length == 0 || matrix[0].length == 0) {
return false;
}
if (matrix.length == 1) {
if (matrix[0].length == 1) {
return matrix[0][0] == target;
}
return isHaveTarget(matrix, target, 0);
}
if (target < matrix[0][0] || target > matrix[matrix.length - 1][matrix[0].length - 1]) {
return false;
}
if (target == matrix[matrix.length - 1][0]) {
return true;
} else if (target > matrix[matrix.length - 1][0]) {
return isHaveTarget(matrix, target, matrix.length - 1);
} else {
int targetRowIndex;
int lowRowIndex = 0;
int highRowIndex = matrix.length - 1;
int midRowIndex=0;
while (lowRowIndex < highRowIndex) {
midRowIndex = lowRowIndex + (highRowIndex - lowRowIndex) / 2;
if (matrix[midRowIndex][0] == target) {
return true;
}
if (matrix[midRowIndex][0] > target) {
highRowIndex = midRowIndex - 1;
}
if (matrix[midRowIndex][0] < target) {
lowRowIndex = midRowIndex + 1;
}
}
if (matrix[midRowIndex][0] > target && matrix[midRowIndex - 1][0] == target) {
return true;
}
if (matrix[midRowIndex][0] < target && matrix[midRowIndex + 1][0] == target) {
return true;
}
if (matrix[lowRowIndex][0] < target) {
targetRowIndex = lowRowIndex;
} else {
targetRowIndex = lowRowIndex - 1;
}
return isHaveTarget(matrix, target, targetRowIndex);
}
}
private boolean isHaveTarget(int[][] matrix, int taget, int targetRowIndex) {
if (taget < matrix[targetRowIndex][0] || taget > matrix[targetRowIndex][matrix[targetRowIndex].length - 1]){
return false;
}
int low = 0;
int high = matrix[targetRowIndex].length - 1;
int mid = 0;
while (low < high) {
mid = low + (high - low) / 2;
if (taget == matrix[targetRowIndex][mid]) {
return true;
}
if (taget > matrix[targetRowIndex][mid]) {
low = mid + 1;
}
if (taget < matrix[targetRowIndex][mid]) {
high = mid - 1;
}
}
if (taget > matrix[targetRowIndex][mid]) {
return matrix[targetRowIndex][mid + 1] == taget;
} else {
return matrix[targetRowIndex][mid - 1] == taget;
}
}