题目
给你一个满足下述两条属性的 m x n 整数矩阵:
- 每行中的整数从左到右按非严格递增顺序排列。
- 每行的第一个整数大于前一行的最后一个整数。
给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。
示例 1:
输入: matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出: true
题解
方式一:两次二分法
public boolean searchMatrix(int[][] matrix, int target) {
int m = matrix.length;
int n = matrix[0].length;
// 找对应行
int l = 0, r = m - 1, row = 0;
while (l <= r) {
int mid = l + (r - l) / 2;
if (matrix[mid][0] > target) {
r = mid - 1;
} else if (matrix[mid][0] < target) {
row = mid;
l = mid + 1;
} else {
return true;
}
}
// 找对应列
l = 0;
r = n - 1;
while (l <= r) {
int mid = l + (r - l) / 2;
if (matrix[row][mid] > target) {
r = mid - 1;
} else if (matrix[row][mid] < target) {
l = mid + 1;
} else {
return true;
}
}
return false;
}
方式二:一次二分
public boolean searchMatrix(int[][] matrix, int target) {
int m = matrix.length;
int n = matrix[0].length;
int l = 0, r = m * n - 1;
while (l <= r) {
int mid = l + (r - l) / 2;
int cur = matrix[mid / n][mid % n];
if (cur > target) {
r = mid - 1;
} else if (cur < target) {
l = mid + 1;
} else {
return true;
}
}
return false;
}
总结
算法:二分法