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.
Example 1:
Input: matrix = [ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50] ] target = 3 Output: true
Example 2:
Input: matrix = [ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50] ] target = 13 Output: false
解法:
二分查找。难点在于列的查找,因为找的是一个范围,注意各种边界条件,很麻烦。
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
//find y
//find x
int y = matrix.length;
if(y == 0) return false;
int x = matrix[0].length;
if(x == 0)return false;
//二分查找
int left = 0;
int right = y-1;
int line_y = 0;
while(right-left>=0){
int mid = (left+right)/2;
if(mid+1<y && matrix[mid][0]<=target && matrix[mid+1][0]>target){
line_y = mid;
break;
}else if(matrix[mid][0]<=target){
left = mid+1;
if(mid+1<y){
line_y = mid+1;
}
}else{
right = mid-1;
if(mid-1>=0){
line_y = mid-1;
}
}
}
//处理横的
left = 0;
right = x-1;
while(right-left>=0){
int mid = (left+right)/2;
if(matrix[line_y][mid] == target){
return true;
}
if(matrix[line_y][mid]>target){
right = mid-1;
}else{
left = mid+1;
}
}
return false;
}
}