LintCode : 搜索二维矩阵
题目
写出一个高效的算法来搜索m × n矩阵中的值。
这个矩阵具有以下特性:
1. 每行中的整数从左到右是排序的。
2. 每行的第一个数大于上一行的最后一个整数。
样例
[
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
给出 target = 3,返回 true
思路
想要找到target,我们首先要找到target所在行。找到target所在行后再寻找target。这里的时间复杂度可以降低至O(lg(n) + lg(m))。首先二分查找每行的第一个元素,找到<=target的最大的元素所在行。再在这行二分查找target。
代码
bool binarySearch((vector<int> &A, int target) {
int p = 0;
int r = A.size() - 1;
while(p <= r) {
int q = (p + r) / 2;
if(A[q] == target) {
return true;
}
else if(A[q] < target) {
p = q + 1;
}
else {
r = q - 1;
}
}
return false;
}
bool searchMatrix(vector<vector<int> > &matrix, int target) {
if(matrix.size() == 0) {
return false;
}
int p = 0;
int r = matrix.size() - 1;
while(p <= r) {
int q = (p + r) / 2;
if(matrix[q][0] == target) {
return true;
}
else if(matrix[q][0] > target) {
r = q - 1;
}
else {
p = q + 1;
}
}
if(p > matrix.size() - 1 || matrix[p][0] > target) {
return binarySearch((matrix[p - 1], target);
}
else {
return binarySearch((matrix[p], target);
}
}