【C语言】杨氏矩阵

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

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

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

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

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

分析解题: 

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

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

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

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

  

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

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

X_chengonly

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

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

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

打赏作者

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

抵扣说明:

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

余额充值