题目描述:在一个二维数组中,每行从左到右都是升序排列,每列从上到下也是升序排列,从一个二维数组中查找一个数是否存在
一般方法:遍历,这样最坏情况也要o(n)的时间
优化方法:假如要查找的数为a
由于每行和每列都是升序的,那么我们先从右上角开始找,
1,如果a等于右上角的这个数,则查找成功;
2,如果小于,则列数减一,或者把当前列删去,然后继续1
3,如果大于,则行数加一,或者把当前行删去,然后继续1
4,如果剩余行数为数组的行数,列数为0,则不存在
这样最坏的查找次数也就是(行数+列数);
实现代码:
bool find(int **p,int row,int col,int key){
bool flag=false;
if(NULL!=p&&row>0&&col>0){
int i=0,j=col-1;
while(i<row&&j>=0){
if(p[i][j]==key){
flag=true;
break;
}
else if(p[i][j]<key)
--j;
else ++i;
}
}
return flag;
}