Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:
- Integers in each row are sorted from left to right.
- The first integer of each row is greater than the last integer of the previous row.
For example,
Consider the following matrix:
[ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50] ]
Given target = 3
, return true
.
题目不难代码如下
public class Sa2M {
public static void main(String[] args){
//int matrix[][] = {{1,3,5,7},{10,11,16,20},{23,30,34,50}};
int matrix[][] = {{1,3}};
int target = 2;
System.out.println(searchMatrix(matrix,target));
}
public static boolean searchMatrix(int[][] matrix, int target) {
int m,n;
m = matrix.length;
n = matrix[0].length;
int mid;
int low,high;
for(int i=0;i<m;i++){
if(target>= matrix[i][0] && target<= matrix[i][n-1]){
low = 0;
high = n-1;
while(low<=high){
mid = (low +high)/2;
if(matrix[i][mid] < target){
low = mid+1;
}else if(matrix[i][mid] >target){
high = mid-1;
}
else{
return true;
}
}
}
}
return false;
}
}
遍历二维数组行,找到目标值所在区间,然后二分查找
太久没做题什么都慢,二分的时候low和high的更新中直接赋值为mid,结果发现在low和high相差为1的时候循环无法结束了
更新的时候mid值已经做过判断,新区间内不应包含mid值,同时在low和high相差1时再次进入循环两值相等,再再次就无法进入循环退出了