这是海涛书上面的一道题目
感觉很有意思。
思路呢就是 根据数组的特性吧,因为右上角为行最大,列最小,那么和我们相比较的元素相比,不管如何如果大 则减列,如果小则减行。
这样不断缩小我们查询的范围,可谓是经典中的经典啊。
书中采用右上角那么我也来小试牛刀
#include "stdio.h"
int findRightBound(int **data,int rows,int cols,int key)
{
int row;
int col;
if(rows==0||cols==0)
{
return -1;
}
row =0;
col =cols-1;
while(row<rows&&col>=0)
{
/*减列*/
if(*(data+row*cols+col)>key)
{
col-=1;
}
else if(*(data+row*cols+col)==key)
{
printf("row %d col %d\n",row,col);
return 1;
}/*最后只能小于,则加行咯*/
else
{
row+=1;
}
}
return -1;
}
/*左下角开始*/
int findLeftBound(int **data,int rows,int cols,int key)
{
int row;
int col;
if(rows==0||cols==0)
{
return -1;
}
row =rows-1;
col =0;
while(col<cols&&row>=0)
{
/*减列*/
if(*(data+row*cols+col)>key)
{
row-=1;
}
else if(*(data+row*cols+col)==key)
{
printf("row %d col %d\n",row,col);
return 1;
}/*最后只能小于,则加行咯*/
else
{
col+=1;
}
}
return -1;
}
int main()
{
int data[4][4]={{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
int rows =4;
int cols =4;
int ret = -1;
int key;
scanf("%d",&key);
ret = findRightBound((int **)data,rows,cols,key);
if(ret == 1)
{
printf("OK\n");
}
else
{
printf("NO\n");
}
ret = findLeftBound((int **)data,rows,cols,key);
if(ret == 1)
{
printf("OK\n");
}
else
{
printf("NO\n");
}
return 0;
}
左下角和右上角其实相似。
这里碰到个问题用于回顾
int **data
如果第二维是固定的,可以类似fun(char* p[4])这样的方式,如果不确定,那么就用二级指针,同时要用一个参数传递第二维的大小,类似fun(char** p, unsiged col),同时在表示其中一个元素时,不能使用p[i][j]这样的写法,必须自行计算出其偏移位置.
所以在函数中不能使用p[i][j]来取元素值,必须自己计算。