【C语言】杨氏矩阵

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

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

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

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

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

【C语言】杨氏矩阵_第1张图片

分析解题: 

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

【C语言】杨氏矩阵_第2张图片

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

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

【C语言】杨氏矩阵_第3张图片

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

【C语言】杨氏矩阵_第4张图片  

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

你可能感兴趣的:(C语言,c语言,算法,矩阵)