剑指offer--二维数组的查找

记录《剑指offer》上的算法题。完整的代码例子可以在我的Github

题目:在一个二维数组中,每一行按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有这个整数。

下面给出一个题目所要求的二维数组:

1 2 8 9 
2 4 9 12
4 7 10 13
6 8 11 15

这道题目的解法是选择右上角或者左下角的数组元素来进行查找。比如,以选择右上角的数组元素为例,当选择的数值大于要查找的整数值,如上述数组中的9,要查找的是7,那么9是第四列的最小值,所以这样就排除了第四列,7就应该存在前三列中,这个时候就选择前三列数组的右上角,也就是9左边的8,然后8还是大于7,进一步排除第三列,继续选择前两列的右上角元素–2,这个时候2就小于7,那么7应该是位于2的右边或者下边,但右边已经查找过,并且被剔除了,所以就只有其下边的这种可能性,此时就剔除第一行了,选择剩下的第二行到第四行和前两列的区域的右上角元素–4,4还是小于7,然后同样剔除所在的行,往下查找,然后就找到7了。

总结上述查找的规律:首先选择数组中右上角的数字。如果该数字等于要查找的数字,查找过程结束;如果该数字大于要查找的数字,剔除这个数字所在的列;如果该数字小于要查找的数字,剔除这个数字所在的行。通过这样的查找,每次查找都可以剔除一行或者一列,每一步都可以缩小范围,直到查找到所查找的数字或者发现查找的数字不存在数组中。

下面是给出实现的函数代码和测试代码:

// 二维数组的查找
bool Find(int* matrix, int rows, int columns, int number){bool found = false;if (matrix != NULL && rows > 0 && columns > 0){int row = 0;// 从右上角开始查找int column = columns - 1;while (row < rows && column >= 0){if (matrix[row * columns + column] == number){found = true;break;}else if (matrix[row * columns + column] > number)column--;elserow++;}}return found;
}
// 测试
int main(void){int rows =  4;int columns = 4;int a[4][4] = {{ 1, 2, 8, 9 }, { 2, 4, 9, 12 }, { 4, 7, 10, 13 }, {6, 8, 11, 15}};int *matrix = a[0];// 二维数组包含查找的数字cout <<"find 7 in matrix:"<< Find(matrix, rows, columns, 7) << endl;// 二维数组不包含查找的数字,数字大于数组的最大值cout << "find 16 in matrix: " << Find(matrix, rows, columns, 16) << endl;// 二维数组不包含查找的数字,数字小于数组的最小值cout << "find 0 in matrix: " << Find(matrix, rows, columns, 0) << endl;// 二维数组不包含查找的数字,数字介于数组最大值和最小值之间cout << "find 3 in matrix: " << Find(matrix, rows, columns, 3) << endl;int *matrix_null = NULL;// 测试输入空指针的情况cout << "find 7 in matrix: " << Find(matrix_null, rows, columns, 7) << endl;system("pause");return 0;
}

选择左下角的数字也是可以实现同样的效果,只是这种情况所剔除是行还是列刚好相反,当这个数字大于所查找的数字,是剔除这个数字所在的行;这个数字小于所查找的数字,剔除这个数字所在的列。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/409005.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

仙元天下试玩感受

仙元天下是安讯网洛旗下的游戏&#xff0c;在官网注册账号的时候就遇到了问题&#xff0c;注册页面无法打开&#xff0c;服务器网址错误&#xff0c;只有返回到官网首页进行快捷注册。 画面2D&#xff0c;有自动打怪&#xff0c;画面感一般&#xff0c;反应比较迟钝&#xff0c…

剑指offer--替换空格

记录《剑指offer》上的算法题。完整的代码例子可以在我的Github。 这是一道有关字符串的问题。首先在C/C中&#xff0c;会把常量字符串放到单独的一个内存区域中&#xff0c;当几个指针赋值给相同的常量字符串时&#xff0c;它们实际上会指向相同的内存地址&#xff1b;但如果…

java打开word文件名乱码怎么解决_Word文档乱码怎么办?解决Word文档乱码的几种常见方法...

最近Word经常出现问题&#xff0c;双击打开后就弹出“文件转换”的对话框&#xff0c;让选择装载此文件时要使用的编码&#xff0c;选择了简体中文&#xff0c;打开文档后还是乱码&#xff0c;遇到这种情况我们应该怎么办呢?解决方法一&#xff1a;把原来的文档另存为*.rtf格式…

剑指offer--从尾到头打印链表

记录来自《剑指offer》的算法题目 链表应该是面试时被提及最频繁的数据结构&#xff0c;它的结构简单&#xff0c;由若干个结点连接成链状结构&#xff0c;其创建、插入结点、删除结点等操作都只需要20行左右的代码就能实现&#xff0c;其代码量比较适合面试。 假设单链表的结…

java序列化表单同步请求_Ajax serialize() 表单进行序列化方式上传文件

通过传统的 form 表单提交的方式上传文件上传文件&#xff1a;不过传统的 form 表单提交会导致页面刷新&#xff0c;但是在有些情况下&#xff0c;我们不希望页面被刷新&#xff0c;这种时候我们都是使用 Ajax 的方式进行请求的。使用 serialize() 对 form 表单进行序列化提交$…

Linux下Nginx的安装和简单管理

nginx下载 http://nginx.org/download/ http://www.2cto.com/os/201206/136381.html转载于:https://www.cnblogs.com/jphp/archive/2013/04/01/2993403.html

谈 数学之美 和 看见

两本书本来是没有什么交集的。 而对于我而言,交集可能是我最近这两本书都买了。闲暇的时间还是会翻一翻的。看见这本书是今天中午到的。发现现在的当当比以前在书的保养上比以前好像好了一点。几本书都是给包住了,防止弄坏了拐角。 两本书我都很喜欢,今天到的书也是立刻就读了起…

剑指offer--用两个栈实现队列

记录《剑指offer》上的算法题。 题目描述如下&#xff1a; 用两个栈实现一个队列&#xff0c;队列的声明如下&#xff0c;请实现它的两个函数appendTail和deleteHead&#xff0c;分别完成在队列尾部插入结点和在队列头部删除结点的功能。 队列的声明如下&#xff1a; templat…

剑指offer--旋转数组的最小数字

记录来自《剑指offer》上的算法题。 题目描述如下&#xff1a; 把一个数组最开始的若干个元素搬到数组的末尾&#xff0c;我们称之为数组的旋转。输入一个递增排序的数组的一个选择&#xff0c;输出旋转数组的最小元素。例如数组{3,4,5,1,2}是{1,2,3,4,5}的一个旋转&#xff0…

python 合并excel 自动更新_手把手教你4种方法用Python批量实现多Excel多Sheet合并

一、前言大家好&#xff0c;我是崔艳飞。前两天给大家分享了Python自动化文章&#xff1a;手把手教你利用Python轻松拆分Excel为多个CSV文件&#xff0c;而后在Python进阶交流群里边有读者遇到一个问题&#xff0c;他有很多个Excel表格&#xff0c;他需要对这些Excel文件进行合…

jQuery布局插件UI Layout简介

UI Layout是一种基于jQuery的布局框架&#xff0c;项目主页http://layout.jquery-dev.net/。该框架的参考原型是ExtJS的border-layout&#xff0c;因此十分适用于将原有使用ExtJS的项目改造成jQuery项目。其核心是一个大小自适应的中心面板&#xff08;必选&#xff09;&#x…

淘到了一个不错的TF卡读卡器

最近换手机的时候一时冲动败了个32G的TF卡。买后又觉得手机存储空间还比较充裕&#xff0c;暂时用不上&#xff0c;便打算套个读卡器当U盘用。最开始我用的是以前买手机的时候送的一个读卡器&#xff0c;但其兼容性很差&#xff0c;在以前的那个8G的卡里还能勉强用用&#xff0…

剑指offer--斐波那契数列

记录来自《剑指offer》的算法题。 题目如下&#xff1a; 写一个函数&#xff0c;输入n&#xff0c;实现斐波那契数列的第n项。 斐波那契数列的定义如下&#xff1a; f(n)⎧⎩⎨01f(n−1)f(n−2)n0n1n>1f(n) = \begin{cases} 0 & n=0 \\ 1 & n=1 \\ f(n-1) + f(n-2…