杨氏矩阵找数字

题目:

有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是 递减的,请编写程序找某个数字是否存在

要求实现复杂度小于O(n)

分析:

右上角的数是一行中最大的,一列中最小的

左下角的数是一行中最小的,一列中最大的

这次取右上角的数来做演示

若我们想找的数为7,将右上角的数与想找的数比较,

若右上角的数大于想找的数,又因为右上角的数是一列中最小的数,所以去掉一列

若右上角的数小于想找的数,又因为右上角的数是一行中最大的数,所以去掉一行

如此循环就能找到要找的数了。

代码:

下面我们来写代码:

#include<stdio.h>

int FoundNum(int arr[3][3], int k, int row, int col)
{
    int x = 0;
    int y = col - 1;//arr[x][y]为矩阵右上角的数
    while (x<=2&&y>=0)
    {
        if (arr[x][y] < k)
        {
            x++;//若右上角的数小于要找的数,则去掉上面一行
        }
        else if (arr[x][y] > k)
        {
            y--;//若右上角的数大于要找的数,则去掉右面面一列
        }
        else
        {
            return 1;
        }
    }
    return 0;
}



int main()
{
    int arr[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
    int k = 7;
    int x = 3;
    int y = 3;
    int ret = FoundNum(arr, k, row, col);
    if (ret == 1)
    {
        printf("找到了,");
    }
    else
    {
        printf("找不到\n");
    }
    return 0;
}

代码虽然显示找到了,但是如何验证是否正确呢?

是否能返回被找到数的下表呢?

接下来我们来进行改进。

首先,我们知道函数只有一个返回值,所以不可能返回下标,

但是我们可以通过指针来获得下标

#include<stdio.h>

int FoundNum(int arr[3][3], int k, int *px, int *py)
{
    int x = 0;
    int y = *px - 1;//arr[x][y]为矩阵右上角的数
    while (x<=2&&y>=0)
    {
        if (arr[x][y] < k)
        {
            x++;//若右上角的数小于要找的数,则去掉上面一行
        }
        else if (arr[x][y] > k)
        {
            y--;//若右上角的数大于要找的数,则去掉右面面一列
        }
        else
        {
            *px=x;//通过指针得到要找数的下标
            *py=y;
            return 1;
        }
    }
    return 0;
}



int main()
{
    int arr[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
    int k = 7;
    int x = 3;
    int y = 3;
    int ret = FoundNum(arr, k, &x,&y);
    if (ret == 1)
    {
        printf("找到了,");
        printf("下标为:x,y");
    }
    else
    {
        printf("找不到\n");
    }
    return 0;
}

以上就是本篇文章的内容了,很感谢你能看到这里

如果觉得内容对你有帮助的话,不妨点个关注

我会继续更新更高质量的内容,我们一同学习,一同进步!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值