【C语言典例】——Day2: 杨氏矩阵

该文章介绍了一个在递增的二维数组(杨氏矩阵)中查找特定数字的方法。通过从最后一列开始逐列搜索,根据数字比较更新行和列索引,以O(N)的时间复杂度寻找目标元素。如果找不到,则输出相应提示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。
要求:时间复杂度小于O(N);

如上所述,我们所描述的就是一个二维数组,每行从左到右是递增的,每列从上到下是递增的,这样的数组就是一个杨氏矩阵,如下图所示:

上图是一个3*3的二维数组,也可以说是一个3*3的杨氏矩阵。

我们在这样的一个数组中查找一个数据,它的时间复杂度是O(N)。
我们在上图杨氏矩阵中可以发现,它的右上角的元素具有特殊性,这个元素是一行中最大的元素,同时也是这一列当中最下的元素。

思路分析:

杨氏绝阵从上到下,从左到右都是递增的,观察杨氏矩阵我们发现每一列上下的元素值都相差3。但是这个规律对我们来说并没有什么实际的用处。既然我们规定了时间复杂度为O(N),那么我们不防从最后一列开始,一列一列的进行查找,如果找不到我们要找的数值K,那么我们就列值减减,向前一列找,按照之前的方式 循环进行,直到查找到元素K。

找到元素K,我们用两个变量进行保存,输出元素所在的位置,没找到则给出提示没有找到。

图示:

代码实现:

void Seek(int arr[3][3], int k,int row,int col)//数组行值可以省略但是列的大小不能省略
{
    int i = 0;
    int j = col-1;
    int r = 0;
    int c = 0;
    while (i<=2 && j>=0)
    {
        if (arr[i][j] < k)
        {
            i++;
        }
        if (arr[i][j] > k)
        {
            j--;
        }
        if (arr[i][j] == k)
        {
             r = i + 1;
             c = j + 1;
             printf("找到了,在第%d行,第%d列\n", r, c);
             break;
        }
    }
    if (i > 2||j<0 )
    {
        printf("此数组中不存在%d\n", k);
    }
}
int main()
{
    int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
    int k = 0;//被查找数字
    scanf("%d", &k);
    //Seek(arr, k,3,3);查找函数
    //查找到了返回1,未查找到返回0
    Seek(arr, k,3,3);
    return 0;
}
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mikk-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值