[timu]
Search a 2D Matrix
Total Accepted: 52191 Total Submissions: 164580Write 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
.
in fact, I think it is a 2d binary search, first binary search line and locate the line.
second, binary search the line and find the target.
[daima]
my accepted solution:
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix == null || matrix.length == 0) return false;
int left = 0;
int right = matrix.length - 1;
while(left <= right){
int mid = left+ (right - left)/2;
int begin = matrix[mid][0];
int end = matrix[mid][matrix[0].length - 1];
if(target < begin){
right = mid - 1;
}else if(target > end){
left = mid + 1;
}else{
return binarySearch(target, matrix[mid]);
}
}
return false;
}
private boolean binarySearch(int target, int[] nums){
if(nums==null|| nums.length == 0) return false;
int start = 0;
int end = nums.length - 1;
while(start<=end){
int mid = start + (end - start)/2;
if(target == nums[mid]) return true;
else if(target > nums[mid]){
start = mid + 1;
}else{
end = mid - 1;
}
}
return false;
}
or zhijie fa:
public boolean searchMatrix(int[][] matrix, int target) {
int row_num = matrix.length;
int col_num = matrix[0].length;
int begin = 0, end = row_num * col_num - 1;
while(begin <= end){
int mid = (begin + end) / 2;
int mid_value = matrix[mid/col_num][mid%col_num];
if( mid_value == target){
return true;
}else if(mid_value < target){
//Should move a bit further, otherwise dead loop.
begin = mid+1;
}else{
end = mid-1;
}
}
return false;
}