定义一个二维数组,每行从左到右是递增的,每列从上到下是递增的,这样的一个数组就是杨氏矩阵,找到k,并返回下标,时间复杂度小于O(n),经检查,不能选左上和右下角写函数

#include /*定义一个二维数组,

每行从左到右是递增的,

每列从上到下是递增的,这样的一个数组就是杨氏矩阵,找到k,并返回下标,时间复杂度小于O(n),经检查,不能选左上和右下角写函数*/

int find(int a[3][3],*px,*py,int k) {

    /*这里我们是从最右上角起,

    因为最右上角是一行中的最大值,

    一列中的最小值*/

    int x=0;

    int y=*py-1;

    while(x<*px&&y>=0) {

        if(a[x][y]

        {

            x++;

        } else if(a[x][y]>k)

        {

            y--;

        } else

        {

            *px=x;

            *py=y;

            return 1;

        }

    }

    return 0;

}

 

int find2(int a[3][3],*px,*py,int k) {

    /*这里我们是从最左下角起,

    因为最左下角是一行中的最小值,

    一列中的最大值*/

    int x=*px-1;

    int y=0;

    while(x<=0&&y<*py) {

        if(a[x][y]

        {

            y++;

        } else if(a[x][y]>k)

        {

            x--;

        } else

        {

            *px=x;

            *py=y;

            return 1;

        }

    }

    return 0;

}

 

 

int main(int argc, char** argv) {

    int a[3][3]= {{1,2,3},{4,5,6},{7,8,9}};

    int x=3;//行

    int y=3;//列

    int k=7;//在二维数组a中是否有k这个数

    int ret1=find(a,&x,&y,7);

    if(ret1==1)

    {

        printf("找到了%d\n",k);

        printf("下标是:%d,%d\n",x,y);

    } else

    {

        printf("找不到%d\n",k);

    }

    int ret2=find2(a,&x,&y,7);

    if(ret1==1)

    {

        printf("找到了%d\n",k);

        printf("下标是:%d,%d\n",x,y);

    } else

    {

        printf("找不到%d\n",k);

    }

    return 0;

}

你可能感兴趣的:(c语言)