分别在深度方向和广度方向二查搜索。
题目
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.
思路
分别在深度方向和宽度方向二查搜索。
代码
public class Solution {
public bool SearchMatrix(int[,] matrix, int target) {
if (matrix.Length == 0) return false; //注意这种特殊情况
int rows = matrix.GetUpperBound(0);
int columns = matrix.GetUpperBound(1);
//bi-search as row
int lo = 0, hi = rows + 1;
while (lo < hi)
{
int mi = lo + (hi - lo) / 2;
if (matrix[mi, 0] <= target)
{
lo++;
}
else hi--;
}
int pos = --lo; //pos is row index for target
if (pos < 0 || pos > rows) return false;
//bi-search as column
lo = 0; hi = columns + 1;
while (lo < hi)
{
int mi = lo + (hi - lo) / 2;
if (matrix[pos, mi] < target)
{
lo++;
}
else if (matrix[pos, mi] > target)
{
hi--;
}
else return true;
}
return false;
}
}