这是海涛书上面的一道题目
感觉很有意思。
思路呢就是 根据数组的特性吧,因为右上角为行最大,列最小,那么和我们相比较的元素相比,不管如何如果大 则减列,如果小则减行。
这样不断缩小我们查询的范围,可谓是经典中的经典啊。
书中采用右上角那么我也来小试牛刀
#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]来取元素值,必须自己计算。