题目:
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:
每行的元素从左到右升序排列。
每列的元素从上到下升序排列。
题解:
有序找某个数想到二分法,这里有多行,因此每行进行二分法,通过target精确到某几行。
- 某一行的第一个元素大于了 target ,当前行和后边的所有行都不用考虑了,直接返回false
- 某一行的最后一个元素小于了 target ,当前行就不用考虑了,换下一行
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return false;
}
for (int i = 0; i < matrix.length; i++) {
//某一行的第一个元素大于了 target ,当前行和后边的所有行都不用考虑了,直接返回 false
if (target < matrix[i][0]) {
break;
}
//某一行的最后一个元素小于了 target ,当前行就不用考虑了,换下一行
if (target > matrix[i][matrix[i].length - 1]) {
continue;
}
int res = binarySearch(matrix[i], target);
if (res != -1) { //找到就返回true
return true;
}
}
return false;
}
//二分查找
private int binarySearch(int[] nums, int target) {
int start = 0;
int end = nums.length - 1;
while (start <= end) {
int mid = start + (end - start) / 2;
if (target < nums[mid]) {
end = mid - 1;
} else if (target > nums[mid]) {
start = mid + 1;
} else {
return mid;
}
}
return -1;
}
}
参考:力扣