题目
二分查找
public boolean searchMatrix(int[][] matrix, int target) {
// 判断目标值是否在矩阵内
if(target < matrix[0][0] || target > matrix[matrix.length - 1][matrix[0].length - 1]) {
return Boolean.FALSE;
}
// 以第一列为基准, 寻找target在哪一行
int row = erfen(matrix, target) - 1;
// 在这一行寻找target
return erfetn(matrix[row], target);
}
public boolean erfetn(int [] nums, int target) {
int left = 0;
int right = nums.length - 1;
int mid;
while (left <= right) {
mid = left + (right - left) / 2;
if (nums[mid] == target) {
return Boolean.TRUE;
}
if (nums[mid] > target) {
right = mid - 1;
}
if (nums[mid] < target) {
left = mid + 1;
}
}
return Boolean.FALSE;
}
public int erfen(int [][] matrix, int target) {
int left = 0;
int right = matrix.length - 1;
// 寻找左边界
while (left <= right) {
int mid = left + (right - left) / 2;
if (matrix[mid][0] == target) {
return = mid + 1;
}
if (matrix[mid][0] > target) {
right = mid - 1;
}
if (matrix[mid][0] < target) {
left = mid + 1;
}
}
return left;
}
思路
(1) 先判断目标元素是否在二维数组范围内
(2) 按第一列进行左边界的二分查找, 寻找元素在哪一行
(3) 在那一行进行二分查找, 寻找目标元素
(4) 需要注意二分查找, 寻找左边界的写法