5.2
可能是刚开始想复杂了吧。
大致思路就是先确定某一行,再确定这一行中是不是含有就可以了。
确定列的时候采用二分查找是没有问题的。
在查找行的时候也想用二分查找,但是出现了一些问题,查找不准确。
后来想,就是找到首元素小于target的最大值那一行就可以了。
然后后来在判断一下。如果 nums【行】【尾元素】的值 < target,行 ++; 如果【行】【首元素】的值 > targer,行- -。
这样对于行的查找就更准确了。
可能比较笨吧。
public class Solution {
/**
* @param matrix, a list of lists of integers
* @param target, an integer
* @return a boolean, indicate whether matrix contains target
*/
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix == null){
return false;
}
int m = matrix.length;
if(m == 0){
return false;
}
int n = matrix[0].length;
if(n == 0){
return false;
}
//System.out.print("m" + m);
if(target < matrix[0][0] || target >matrix[m-1][n-1]){
return false;
}
int low = 0;
int height = m-1;
int mid1 = 0;
//这里先找到某一行,这一行的头元素是最大的小于target的值
/*就是先要把行确定了
如果查找 行 也采用二分查找的话
二分查找的原则是什么呢?
如果 行的尾元素是小于 mid 的值
那就 ++;{
此时如果行的首元素变得大于 mid了,
就可以直接返回false了。
}
或者说,其实也没有那么复杂
就是找到 小于 target 的最大值,返回那一行就可以了。
*/
while(low < height){
if(matrix[low][0] == target || matrix[height][0] == target){
return true;
}
mid1 = (low + height)/2;
if(matrix[mid1][0] == target){
return true;
}
if(matrix[mid1][0] > target){
height = mid1 -1;
continue;
}
if(matrix[mid1][0] < target){
low = mid1 + 1;
continue;
}
}
if(matrix[mid1][0] > target){
mid1 --;
}
if(matrix[mid1][n-1] < target){
mid1 ++;
}
//System.out.print("mid1 = " + mid1);
if(matrix[mid1][n-1]==target){
return true;
}
int left = 0;
int right = n-1;
int mid = 0;
while(left <= right){
if(matrix[mid1][low] == target || matrix[mid1][right] == target){
return true;
}
mid = (left + right)/2;
if(matrix[mid1][left] == target || matrix[mid1][right] == target){
return true;
}
if(matrix[mid1][mid] == target){
return true;
}
if(matrix[mid1][mid] < target){
left = mid + 1;
}
if(matrix[mid1][mid] > target){
right = mid - 1;
}
}
return false;
// write your code here
}
}