C语言题目:杨氏矩阵
这种矩阵,只需要一个二维数组就可以创建,查找时也只需要在二维数组里查找就可以了。
但是,如果这样查找,尝试过的人都知道,这样就需要使用两个循环,此时的时间复杂度就是0(n²)了。
可是题目要求时间复杂度,为0(n)
如果对时间复杂度不了解可以先看看:
数据结构与算法:时间复杂度_srhqwe的博客-CSDN博客
所以就需要使用其他方法:
不妨先创建一个题目要求的矩形,这样的矩形可以用二维数组创建,为了方便就创建一个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语句:
其中,将找到的下标,放在了在函数内部创建的数组的内部。文章来源:https://www.toymoban.com/news/detail-400701.html
注意!:未来返回的数组是在函数内部创建的,当这个函数调用完成后,该数组的内存会被释放,此时这块空间就没了。很多保留的方法,这里举例四种:①这里可以用malloc函数,此时的内存空间是动态的,所以会消失 ,②也可以再数组前加static相当于变成全局变量,③又可以再main函数内创建两个指针,让指针指向其中的数组第一个和第二个元素的地址,④还可以像我这上面,将他们的值放到不同的变量中。文章来源地址https://www.toymoban.com/news/detail-400701.html
最终可以看到,时间复杂度为O(n),满足了题目要求。
到了这里,关于C语言题目:在杨氏矩阵中,寻找某个数字是否存在的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!