For example,
Consider the following matrix:
[ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50] ]
Given target = 3, return true.
Use binary search to find the row first and then find the element.
C++ Code:
/*
* func: search_matrix_helper
* goal: recursive helper function to do matrix binary search
* @param matrix: input matrix
* @param row_start: starting row searching index
* @param row_end: ending row searching index
* @param column_start: starting column searching index
* @param column_end: ending column searching index
* @param target: target value
* return: true or false
*/
bool search_matrix_helper(const vector<vector<int> > &matrix, int row_start, int row_end, int column_start, int column_end, int target){
if(row_start >= row_end){
if(column_start >= column_end){
return matrix[row_start][column_start] == target;
}
int mid = column_start + (column_end - column_end)/2;
if(matrix[row_start][mid] == target){
return true;
}else if(matrix[row_start][mid] < target){
return search_matrix_helper(matrix, row_start, row_end, mid+1, column_end, target);
}else{
return search_matrix_helper(matrix, row_start, row_end, column_start, mid-1, target);
}
}
int mid = row_start + (row_end - row_start)/2;
if(matrix[mid][0] == target){
return true;
}else if(matrix[mid][0] > target){
return search_matrix_helper(matrix, row_start, mid-1, column_start, column_end, target);
}else if(matrix[mid][0] < target && target <= matrix[mid][column_end]){
return search_matrix_helper(matrix, mid, mid, column_start, column_end, target);
}else{
return search_matrix_helper(matrix, mid + 1, row_end, column_start, column_end, target);
}
}
/*
* func: search_matrix
* goal: find the target in the sorted matrix
* @param matrix: input matrix
* @param target: input target
* return: true or false
*/
/*
* Use the idea of binary search
* complexity: time O(log(mn)), space O(1)
*/
bool search_matrix(const vector<vector<int> > &matrix, int target){
int m = matrix.size();
if(m == 0){
return false;
}
int n = matrix[0].size();
return search_matrix_helper(matrix, 0, m-1, 0, n-1, target);
}
Python Code:
# func: search value in a sorted matrix
# @param matrix: input matrix
# @param target: target value
# @return: True or False
# complexity: time O(log(mn)), space O(1)
def search_matrix(matrix, target):
m = len(matrix)
if m == 0:
return False
n = len(matrix[0])
start_row = 0
end_row = m-1
while start_row < end_row:
mid = start_row + (end_row - start_row)/2
if matrix[mid][0] == target:
return True
elif matrix[mid][0] > target:
end_row = mid-1
elif matrix[mid][0] < target <= matrix[mid][-1]:
start_row = mid
break
else:
start_row = mid + 1
start_col = 0
end_col = n-1
while start_col <= end_col:
mid = start_col + (end_col - start_col)/2
if matrix[start_row][mid] == target:
return True
elif matrix[start_row][mid] > target:
end_col = mid-1
else:
start_col = mid + 1
return False
No comments:
Post a Comment