Search a 2D Matrix
Description
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]
]
题意理解
给出一个二位矩阵,其中每一行从左到右升序排序,每一列的首数字大于前一列的末尾数字,要求快速判断某一个数字是否存在于矩阵中
解题思路
想法很平常,首先判断这个数字应该存在于哪一行,锁定所在行的行数;
然后用二分法查找这一行,判断数字是否存在;
代码
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if (matrix.empty()){
return false;
}
bool res = false;
int row = -1;
for (int i = 0; i < matrix.size() - 1; i++){
if (target >= matrix[i][0] && target < matrix[i + 1][0]){
row = i;
}
}
int last = matrix.size();
//如果查找不到所在的行数时
if (row == -1){
//如果matrix的行数大于1,判断target是否在最后一行
if (last > 1){
return find(matrix[last - 1], matrix[last - 1].size(), target);
}
//如果matrix只有一行,判断target是否在第0行
else if (last == 1){
return find(matrix[0], matrix[0].size(), target);
}
//如果都不是,就不存在这个target
else
return false;
}
res = find(matrix[row], matrix[0].size(), target);
return res;
}
/*二分法查找某一个数是否存在*/
bool find(vector<int> &a, int n,int k){
int low = 0;
int high = n - 1;
int mid;
while (low <= high)
{
mid = (low + high) / 2;
if (a[mid] == k){
return true;
}
else if (a[mid] > k){
high = mid - 1;
}
else if (a[mid] < k){
low = mid + 1;
}
}
return false;
}