题目
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:
1.Integers in each row are sorted from left to right.
2.The first integer of each row is greater than the last integer of the previous row.
解法1:有序数组的折半查找
先找出target属于哪一行,然后在此行中进行查找
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix.length == 0 || matrix[0].length == 0)
return false;
int start = 0, end = matrix.length-1;
if(target < matrix[start][0] || target > matrix[matrix.length-1][matrix[0].length-1])
return false;
if(target >= matrix[end][0])
start = end;
else{
while(end - start > 1){
int mid = (end + start)/2;
if(target >= matrix[mid][0] && target < matrix[end][0])
start = mid;
else
end = mid;
}
}
int row = start;
start = 0;
end = matrix[0].length-1;
while(start <= end){
int mid = (start+end)/2;
if(target < matrix[row][mid])
end = mid - 1;
else if(target > matrix[row][mid])
start = mid + 1;
else
return true;
}
return false;
}
解法2
将二维矩阵看作是一维数组,进行折半查找
对应关系:
m*n matrix[i][j] == array[i*n + j]
array[x] == matrix[x/n][x%n]
折半查找
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix.length == 0 || matrix[0].length == 0)
return false;
int m = matrix.length,n = matrix[0].length;
int l = 0,r = m*n - 1;
while(l < r){
int x = (l + r)/2;
if(matrix[x/n][x%n] == target)
return true;
else if(matrix[x/n][x%n] <= target)
l = x + 1;
else
r = x - 1;
}
return matrix[l/n][l%n] == target;
}