剑指offer上这道题的方法是从二维数组的右上方元素 m 开始查找,若m > n,则 则向下查找;若 m < n,则向左查找。思路挺简单的,但是如果数据量很大,则查找起来就很鸡肋~~~,如下:
char Find(int *arr,int rows,int cols,int n)
{
int found = -1;
if(arr == NULL || rows < 0 || cols < 0)
return 0;
else
{
int row = 0;
int col = cols - 1;//从矩阵的右上角开始
while(row < rows && col >= 0)
{
if(arr[row*cols + col] == n)
{
found = 1;
break;
}
else if(arr[row*cols + col] > n)//向左走
col--;
else //向下走
row++;
}
}
return found;
}
那如果这样,我们可以从任意一个角开始~~~~
既然数据行 列有序,查找的最好办法就是结合 折半查找,毕竟,折半查找真的是一个很优秀的算法啊
int BinSearch(int *arr,int len,int key)
{
int i = 0;
int j = len-1;
int mid;
while(i < j)
{
mid = (i+j)/2;
if(arr[mid] == key) return mid;
else if(arr[mid] < key) i = mid+1;
else j = mid-1;
}
return mid;
}
bool Bin_SearchK(int (*arr)[col],int key)
{
int index ;
for(int i = 0;i < col;i++)
{
index = BinSearch(arr[i],index+1,key);
if(index < 0)
{
printf("不存在\n");
return false;
}
if(arr[i][index] == key)
{
printf("存在\n");
return true;
}
}
return false;
}