这题就比较简单了都。因为下一个行的头一个比上一行的最后一个还要大,那么我们先确定行的范围,然后进行二分查找就行。,那么从哪里开始找?
从右上角的开始找,右上角的元素大于target,那么可能的值就是这一行了,可以开始做二分查找了,如果target大于右上角的值,那么就可以忽略这一行了,直接去判断下一行的最后一个元素了,因为最后一个元素就是当前行的最大元素,如果这都不能比target大,那么别的元素肯定是只会差距更大的,没有比较的必要了。
一下代码有注释,你可以跟着注释来看看代码的实现。
Show the code:
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
// 判断是否是空数组
if (matrix == null || matrix.length == 0){
return false;
}
int len = matrix.length;
int rowLen = matrix[0].length;
// 判断行的数据是否为空。
if (rowLen == 0) {
return false;
}
// 先判断目标值可能是在那一行中。
int targetRow = 0;
for (int i = 0; i < len; ++i) {
if (target <= matrix[i][rowLen - 1]) {
targetRow = i;
break;
}
}
// 利用二分法查找是否存在目标值,二分法这里注意,循环的条件是 start <= end;还有一个就是需要中点的取值的表达式需要注意。
int start = 0;
int end = rowLen - 1;
while (start <= end) {
int middle = start + ((end - start) >> 1);
if (matrix [targetRow][middle] > target) {
end = middle - 1;
} else if (matrix [targetRow][middle] < target) {
start = middle + 1;
} else {
return true;
}
}
return false;
}
}
时间就是O(logn)
从效果来看,成绩还是很不错的哦。