分别在深度方向和广度方向二查搜索。
题目
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);
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;
if (pos <
0 || pos > rows)
return false;
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;
}
}