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.
二分查找,由于矩阵的特殊性质,我这里用了两种做法
第一种O(nlogn):
bool searchMatrix(int** matrix, int matrixRowSize, int matrixColSize, int target) {
int n = matrixRowSize, m = matrixColSize;
for(int i = 0; i < n; i++)
{
int l = 0, r = m - 1, mid;
while(l <= r)
{
mid = (l + r) / 2;
if(matrix[i][mid] == target)
return true;
if(matrix[i][mid] > target)
r = mid - 1;
else
l = mid + 1;
}
}
return false;
}
另一种O(logn + logm):
bool searchMatrix(int** matrix, int matrixRowSize, int matrixColSize, int target) {
int i = 0, j = matrixRowSize - 1, mid;
while(i <= j)
{
mid = (i + j) / 2;
if(matrix[mid][matrixColSize - 1] == target)
return true;
if(matrix[mid][matrixColSize - 1] > target)
j = mid - 1;
else
i = mid + 1;
}
if(i >= matrixRowSize) return false;
int l = 0, r = matrixColSize - 1;
while(l <= r)
{
mid = (l + r) / 2;
if(matrix[i][mid] == target)
return true;
if(matrix[i][mid] > target)
r = mid - 1;
else
l = mid + 1;
}
return false;
}