一道C语言编程题,题目如下:
有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。
要求:时间复杂度小于O(N);
对于这道题的题解,纯属编程小白个人理解,如有不足,恳请斧正。
开始解题之前,我们可以先移步到百度百科查询杨氏矩阵的定义,我们可以看到:
分析解题:
我们可以知道一个二维数组满足每行从左到右是递增的,每列从上到下是递增的就可以说它是杨氏矩阵。那我们可以定义一个满足这个条件的二位数组,再遍历数组查找某个数字即可。这是最简单的解法:
但是这样遍历数组的方法不满足时间复杂度(小于O(N))的要求。
所以,我们有一个时间复杂度满足要求的方法:我们不难发现杨氏矩阵的左下角和右上角的元素是有特点的 。左下角元素是一行中最小的、是一列中最大的;右上角元素是一行中最大的、是一列中最小的。所以我们就可以从左下角或右上角开始查找。我们以左下角查找为例:如果左下角元素大于需查找元素(比最小的元素还小),我们就可以去掉左下角所在行;如果左下角元素小于需查找元素(比最大的元素还大),我们就可以去掉左下角所在列。然后继续将新的左下角元素与需查找元素比较。这样比较一次课去掉一行或一列,就比遍历数组高效。
基于以上思想,代码如下:
这道题就解决完了,感谢您的阅读,最后,如有不足,恳请斧正!