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
.
This problem can be divided into two part, first, find the first element > target in the first column, the target must before that element, second, look into the row and then do binary search.
ex target == 5, find 10 as the first element that greater than the target, and then do the binary search in the row before 10, which is [1,3,5,7]
1.Java
{
public boolean searchMatrix(int[][] matrix, int target) {
int len = matrix.length - 1;
int width = matrix[0].length - 1;
int start = 0;
int n = 0;
int m = 0;
while(start + 1 < len){
int mid = start + (len - start)/2;
if (matrix[mid][0] < target){
start = mid;
}
else if(matrix[mid][0] > target){
len = mid;
}
else{
return true;
}
}
if(matrix[start][0] == target || matrix[len][0] == target){
return true;
}
if(matrix[len][0] < target){
n = len;
}
else if(matrix[start][0] < target && matrix[len][0] > target){
n = start;
}
start = 0;
while(start + 1 < width){
int mid = start + (width - start)/2;
if(matrix[n][mid] < target){
start = mid;
}
else if(matrix[n][mid] > target){
width = mid;
}
else{
return true;
}
}
if(matrix[n][start] == target || matrix[n][width] == target){
return true;
}
return false;
}
}
2.Python
class Solution:
"""
@param matrix, a list of lists of integers
@param target, an integer
@return a boolean, indicate whether matrix contains target
"""
def searchMatrix(self, matrix, target):
# write your code here
if len(matrix) == 0:
return False
length = len(matrix) - 1
width = len(matrix[0]) - 1
start = 0
n = 0
m = 0
while start + 1 < length:
mid = start + (length - start)/2
if matrix[mid][0] < target:
start = mid
elif matrix[mid][0] > target:
length = mid
else:
return True
if matrix[start][0] == target or matrix[length][0] == target:
return True
if matrix[length][0] < target:
n = length
if matrix[start][0] < target and matrix[length][0] > target:
n = start
start = 0
while start + 1 < width:
mid = start + (width - start)/2
if matrix[n][mid] < target:
start = mid
elif matrix[n][mid] > target:
width = mid
else:
return True
if matrix[n][start] == target or matrix[n][width] == target:
return True
return False