记录《剑指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;
}

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

剑指offer--二维数组的查找相关推荐

  1. 剑指Offer——二维数组的查找(C语言)

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

  2. 剑指Offer 二维数组中的查找

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

  3. python 二维数组长度_剑指offer二维数组中的查找【Java+Python】

    点击上方"蓝字",关注了解更多 二维数组中的查找 1. 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序 ...

  4. 剑指offer - 二维数组中的查找

    题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. /* 思路 * 矩阵是 ...

  5. 【二分法】剑指offer:二维数组中的查找

    对于二维数组中每一个一维数组,用二分查找,判断能否找到该数 leetcode专题笔记:二分法查找(1)(附leetcode题)_m0_52043808的博客-CSDN博客 代码: class Solu ...

  6. 隔一段时间查找一次 golang_剑指 offer-04 二维数组中的查找

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

  7. 剑指offer 二维有序数组查找

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

  8. 剑指0ffer04.二维数组中的查找

    在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 示例: 现 ...

  9. 剑指Offer04. 二维数组中的查找

    在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 相当于二叉 ...

  10. 剑指offer之二维数组中查找

    1 问题 二维数组中查找: 在一个二维数组钟,每一行都按照从左到右递增得顺序排列,每一列 都按照从上往下得递增排列,请完成一个函数,输入这样得一个二维数组和一个 整数,判断数组是否含有该整数 列如: ...

最新文章

  1. Maven系列三Maven内置变量
  2. dev控件中LookUpEdit的数据绑定问题
  3. python中转义字符怎么用_python中的转义字符i
  4. 编译Linux版本飞鸽传书的不完全解决办法
  5. [thinkphp 5.0源码阅读] 缓存(一)
  6. html中右边框出不来,html,为什么右边框会被挡住?
  7. 亚马逊EC2根硬盘空间扩容
  8. Python3之Memcache使用
  9. 8-4 如何使用线程本地数据
  10. GIS应用类有哪些最新发表的毕业论文呢?
  11. 2750 心系南方灾区
  12. MLO/uboot-spl.bin和uboot.img/uboot.bin
  13. 【Json转换为实体类】
  14. 在windows中使用bat脚本获取linux服务器文件
  15. java去除多余excel_java使用poi删除excel中的空行
  16. Kaggle超市客户分类-KMeans无监督案例
  17. nvme-cli常用指令
  18. 今日头条组图下载本地,并存入MongoDB
  19. python中的遍历
  20. benchmarksql测试mysql_使用benchmarkSQL测试数据库的TPCC

热门文章

  1. java编程 内存_Java编程技术之浅析JVM内存
  2. php缓存注入,利用Thinkphp 5缓存漏洞实现前台Getshell
  3. vs窗体 oracle,VS2010连接oracle数据库的简单例子
  4. DataTables获取指定元素的行数据
  5. 自定义控件-实现TextBox的禁止粘贴
  6. 前端学习(3251):样式的模块化
  7. 前端学习(3189):react简介
  8. 前端学习(3169):react-hello-react之删除一个todoList
  9. 前端学习(2900):微信小程序简介
  10. [vue] vue-loader是什么?它有什么作用?