【C语言】杨氏矩阵

本文是一道C语言编程题,要求在每行从左到右、每列从上到下递增的数字矩阵(杨氏矩阵)中查找某个数字是否存在,且时间复杂度小于O(N)。介绍了简单遍历数组的方法,但不满足时间复杂度要求,还给出了从左下角或右上角开始查找的高效方法,并给出了代码。

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

一道C语言编程题,题目如下:

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

要求:时间复杂度小于O(N);

对于这道题的题解,纯属编程小白个人理解,如有不足,恳请斧正。

开始解题之前,我们可以先移步到百度百科查询杨氏矩阵的定义,我们可以看到:

分析解题: 

我们可以知道一个二维数组满足每行从左到右是递增的,每列从上到下是递增的就可以说它是杨氏矩阵。那我们可以定义一个满足这个条件的二位数组,再遍历数组查找某个数字即可这是最简单的解法:

但是这样遍历数组的方法不满足时间复杂度(小于O(N))的要求。

所以,我们有一个时间复杂度满足要求的方法:我们不难发现杨氏矩阵的左下角和右上角的元素是有特点的 。左下角元素是一行中最小的、是一列中最大的;右上角元素是一行中最大的、是一列中最小的。所以我们就可以从左下角或右上角开始查找。我们以左下角查找为例:如果左下角元素大于需查找元素(比最小的元素还小),我们就可以去掉左下角所在行;如果左下角元素小于需查找元素(比最大的元素还大),我们就可以去掉左下角所在列。然后继续将新的左下角元素与需查找元素比较。这样比较一次课去掉一行或一列,就比遍历数组高效

基于以上思想,代码如下:

  

这道题就解决完了,感谢您的阅读,最后,如有不足,恳请斧正! 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

X_chengonly

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

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

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

打赏作者

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

抵扣说明:

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

余额充值