一般常用的二分查找模板如下:
int l = 0, r = n - 1;
while(l < r) {
int mid = l + r;
if (check(mid)) r = mid;
else l = mid + 1;
}
while(l < r) {
int mid = l + r >> 1;
if (check(mid)) l = mid;
else r = mid - 1;
}
但是本题是一个二维数组, 不能用上述常规的思路进行查找。
因此,需要发现新的规律,那就是,数组是从左至右递增,从上至下递增。因此,mid可以选择左下角或者右上角,以右上角为例:小于右上角的元素都在左边的列,而大于右上角的元素都在下面的行中,所以每次查找至少可以剔除一行或者一列数字,较少循环次数。
C++代码如下:
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
int rows = array.size();
if (rows == 0) return false;
int cols = array[0].size();
if (cols == 0) return false;
int row = 0, col = cols - 1;
while(row < rows && col >= 0) {
if (target == array[row][col]) {
return true;
}
else if(target > array[row][col]) {
++row;
}
else {
--col;
}
}
return false;
}
};
其中,对一个二维数组 array[行][列]
数组名.size(),返回的是行数的大小;
数组名[0].size(),返回的是列数的大小;