版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/PZHU_CG_CSDN/article/details/81937882
题目描述:
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思路:既然每一行是有序的,那么就遍历行(key 大于数组第一位小于最后一位,那么说明 key 可能在当前这一行中),然后在当前行中二分查找 key,跑完整个过程如果没找到就证明不存在 key。
代码:
bool Find(int key, vector<vector<int> > a) {
int r = a.size();
for(int i = 0;i < r;i++){
int l = a[i].size();
if(l == 0 ) return false;
int left = a[i][0];
int right = a[i][l - 1];
if(key >= left && key <= right){
int left2 = 0;
int right2 = l-1;
while(left2 <= right2){
int mid = (left2 + right2) / 2;
if(a[i][mid] < key){
left2 = mid + 1;
}else if(a[i][mid] > key){
right2 = mid - 1;
}else{
return true;
}
}
}
}
return false;
}
注意:二维数组可能为空,比如这样的一个二维数组 { {},{},{} },行不为0,但是列为0,所以获取列数应当放在 for 循环里面,防止发生数组越界。