剑指offer--二维数组的查找
来源:互联网 发布:怎么改淘宝店铺地址 编辑:程序博客网 时间:2024/05/12 16:33
记录《剑指offer》上的算法题。完整的代码例子可以在我的Github
题目:在一个二维数组中,每一行按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有这个整数。
下面给出一个题目所要求的二维数组:
1 2 8 9 2 4 9 124 7 10 136 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--; else row++; } } 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;}
选择左下角的数字也是可以实现同样的效果,只是这种情况所剔除是行还是列刚好相反,当这个数字大于所查找的数字,是剔除这个数字所在的行;这个数字小于所查找的数字,剔除这个数字所在的列。
- 剑指offer - 二维数组的查找
- 剑指offer—二维数组的查找
- 二维数组的查找(剑指offer)
- 剑指offer--二维数组的查找
- 《剑指offer》之二维数组的查找
- 剑指offer--二维数组的查找
- 【剑指offer】二维数组的查找
- 【剑指offer】二维数组的查找
- 剑指offer系列----二维数组的查找
- 剑指offer-1、二维数组的查找
- 剑指offer 3---二维数组的查找
- 剑指offer之二维数组的查找
- 剑指Offer--1.二维数组的查找
- 剑指Offer--二维数组的查找
- 剑指offer(一) 二维数组的查找
- 剑指offer—二维数组的查找
- 剑指offer 二维数组的查找
- 剑指offer编程---二维数组的查找
- 【OpenCV入门教程之五】 分离颜色通道&多通道图像混合
- Kafka系列1----Kafka安装与相关命令
- 【codeforces103A】Testing Pants for Sadness
- arduino uno , 舵机和步进电机不能同时工作的问题。
- tomcat启动startup.bat一闪而过
- 剑指offer--二维数组的查找
- Assets 与 Res android的两大资源的获取 与android studio中assets文件的创建
- 【OpenCV入门教程之六】 创建Trackbar & 图像对比度、亮度值调整
- psql:connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
- 系统开发中是否使用框架?
- 如何快速通过对方微信好友验证!
- java运行过程,初始化的顺序,构造函数,变量作用域,反射机制,面向对象的特征
- canvas绚丽的时钟效果(下)
- 设置gif动图