【C语言】在杨氏矩阵里找一个数字是否存在。

要求:

杨氏矩阵
有一个二维数组.
数组的每行从左到右是递增的,每列从上到下是递增的.
在这样的数组中查找一个数字是否存在。
时间复杂度小于O(N);

数组:

1 2 3

2 3 4

3 4 5


#include<stdio.h>
#include<stdlib.h>
int find_yang(int a[][3],int row,int n)
{
    int i = 0;
    int j = 2;
    while((i<row)&&(j>=0))
    {
        if(n>a[i][j])
        {
            i++;
        }
        else if(n < a[i][j])
        {
            j++;
        }
        else
        {
            return 1;
        }
    }
    return -1;
}


int main()
{
    int yang[][3] = 
    {{1,2,3},{4,5,6},{7,8,9}};
    int n = 0;
    printf("please Enter:");
    scanf("%d",&n);
    printf("ret = %d\n",find_yang(yang,3,n));

    system("pause");
    return 0;
}

  --------------------  杨氏矩阵里找数字 ------------------------------
#include<stdio.h>
int found(int a[][3],int j,int n)
{
    int i = 0;              //行
    j--;      //因为传过来的是列,列在主函数已经已经确定,是3,那么这里3--,j就是2,是最后一列的列号
    for(i = 0;i<=j;)   //因为我们是从第一行的最后一个数字开始找,如果大于这个数字,就找下一行(i+1),如果小于这个数字,就找左边一列(j-1),那么这里i<j就很好理解了。第二个分号后面是循环条件,这里的循环条件是被限制的,
    {
        if(n>a[i][j])      //(这里的a[i][j]最初是a[0][2],是第一行的最后一个数字。)如果找的数字大于它,那么...
        {
            i++;      //行+1,就往这个数字下面取去找
        }
        else if(n<a[i][j])   //如果找的这个数字小于a[i][j],那么就找这个数字左边的那个数字,也就是行不变,列-1,(j-1);
        {
            j--;
        }
        else if(n == a[i][j])
        {
            return 1;
        }
    }   
}
int main()
{
    int found(int a[][3],int j,int n);
    int a[][3] = {{1,2,3},{2,3,4},{3,4,5}};
    int n;
    printf("请输入要找的数字n:");
    scanf("%d",&n);

    if(found(a,3,n)==1)
    {

        printf("找到了!\n");
    }
    else
    {
        printf("找不到!\n");
    }

    return 0;
}

这里写图片描述

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_41420688/article/details/80488595