一次二分
class Solution {
// 法1. 一次二分
public boolean searchMatrix(int[][] matrix, int target) {
for (int i = 0; i < matrix.length; i++) {
if (matrix[i][matrix[i].length - 1] >= target) {
boolean t = binarySearch(matrix, target, i);
if (t == true) return true;
}
}
return false;
}
private boolean binarySearch(int[][] matrix, int target, int row) {
int length = matrix[row].length;
int l = 0, r = length - 1, m;
while (l <= r) {
m = l + (r - l) / 2;
if (matrix[row][m] == target) return true;
else if (matrix[row][m] < target) l = m + 1;
else r = m - 1;
}
return false;
}
}
两次二分
二分查找系列
class Solution {
// 法2. 两次二分
public boolean searchMatrix(int[][] matrix, int target) {
// 对于在哪一列进行二分查找,还可以进行一次二分
int l = 0, r = matrix.length - 1, m;
while (l <= r) {
m = l + (r - l) / 2;
if (matrix[m][0] <= target) l = m + 1;
else r = m - 1;
}
if (r < 0) return false;
return binarySearch(matrix, target, r);
}
private boolean binarySearch(int[][] matrix, int target, int row) {
int length = matrix[row].length;
int l = 0, r = length - 1, m;
while (l <= r) {
m = l + (r - l) / 2;
if (matrix[row][m] == target) return true;
else if (matrix[row][m] < target) l = m + 1;
else r = m - 1;
}
return false;
}
}