C语言题目:在杨氏矩阵中,寻找某个数字是否存在

C语言题目:杨氏矩阵

4834ce4a83ee7a26bd694a199919a167.png

        这种矩阵,只需要一个二维数组就可以创建,查找时也只需要在二维数组里查找就可以了。

        但是,如果这样查找,尝试过的人都知道,这样就需要使用两个循环,此时的时间复杂度就是0(n²)了。

可是题目要求时间复杂度,为0(n)

如果对时间复杂度不了解可以先看看:

数据结构与算法:时间复杂度_srhqwe的博客-CSDN博客

66a3eab289ad256c999a41d0bd9a9323.png

所以就需要使用其他方法:

        不妨先创建一个题目要求的矩形,这样的矩形可以用二维数组创建,为了方便就创建一个3x3的矩形int arr[3][3]={1,2,3,4,5,6,7,8,9};

        并且创建需要找到的数字,因此创建变量int k;并且使用scanf()函数控制变量k;

        创建函数sentence()函数,sentence()函数用来寻找这个数字,返回变量是int类型的数组的首元素地址,这个数组内存放了,需要找到的某个数字的下标。

         (看完整篇代码再看这里,会放再下面)注意!:未来返回的数组是在函数内部创建的,当这个函数调用完成后,该数组的内存会被释放,此时这块空间就没了。很多保留的方法,这里举例四种:①这里可以用malloc函数,此时的内存空间是动态的,所以会消失 ,②也可以再数组前加static相当于变成全局变量,③又可以再main函数内创建两个指针,让指针指向其中的数组第一个和第二个元素的地址,④还可以像我这上面,将他们的值放到不同的变量中。

         

         并且打印出存放在数组内的位置。

        既然要在数组内找数字,必然需要传入数组和需要找到的数组,即:

       

sentence()函数的实现:

        

        

        此时,这是我们创建的九宫格。

   

实现原理:

               我们可以通过把每个单元格去掉,从而找到我们需要找到的数字。

       我们可以看题目中九宫格的特征:        

        那怎么去掉呢?可以定位一个数,这个数的位置在右上角,比如:3这个数字的位置,它的左边比它小,它的下边比它大。如果我们需要找到的这个数字k:

        如果k>3,那么说明我们要找的数在3的下边,那么也就可以去掉上面那一行。

        如果k<3,那么说明我们要找的数在3的左边,那么也就可以去掉右边那一列那一。

        

假如,k=7:

        那么第一次,比较,k>3,则去掉上面一排:

                        

               第二次,比较,还是选择用到右上角的数字6,k>6,则去掉上面一排:

                                

                第三次,比较,还是选择用到右上角的数字9,k<9,则去掉右边这一列:

                                         ​​​​​​​

                 第四次,比较,还有选择右上角的数字8,k<8,则去掉右边这一列:

                                        

                第五次,比较,还是选择右上角的数字7,k==7,则找到了此时的值

注意:不一定必须要使用右上角这个数字,也可以是左下角,只要可以起到判断作用就行!

        所以得到了:

        

 代码解释:

        

         先创建了int x,y;用来表示下标(行和列)。x=0,y=2表示的是第一行,第三列,也就是表示右上角这个数字

        进入while循环,其中while循环的条件:

                

                按照刚刚所说的原理,如果每行每列都一至被去掉,那么如果没找到,就会把整个矩阵去掉。那么如果 整个矩形都去掉了,也就可以让while循环停下了。

                所以while(x <= 2 && y>=0)是将坐标控制在九宫格内。

其中的if语句和原理所说的如出一辙,只要带入原理自然就理清楚代码逻辑了。

        比较重要的是最后的else语句:

              其中,将找到的下标,放在了在函数内部创建的数组的内部。

注意!:未来返回的数组是在函数内部创建的,当这个函数调用完成后,该数组的内存会被释放,此时这块空间就没了。很多保留的方法,这里举例四种:①这里可以用malloc函数,此时的内存空间是动态的,所以会消失 ,②也可以再数组前加static相当于变成全局变量,③又可以再main函数内创建两个指针,让指针指向其中的数组第一个和第二个元素的地址,④还可以像我这上面,将他们的值放到不同的变量中。

最终可以看到,时间复杂度为O(n),满足了题目要求。

        

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

srhqwe

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

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

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

打赏作者

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

抵扣说明:

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

余额充值