二维数组中的查找
2016-06-12 15:57
218 查看
题目:在一个二维数组中,每一行都按从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
例如下面的二维数组就是每行、每列都递增的数组。如果在这个数组中查找数字7,则返回true;如果在这个数组中查找数字13,则返回false。
思路:1、选取数组右上角的数字4。由于9大于7,并且9是第4列第一个数字,所以7不可能在9所在的列。
2、接下来分析剩下的三列,在剩下的矩阵中,右上角的数字8同样大于7,所以7也不可能在8所在的列,剔除该列。
3、接下来分析剩下的两列,右上角的数字2小于7,所以7可能在2的下边。剔除2所在的行。
4、接下来分析剩下的三行两列,右上角数字4小于7,剔除4所在的行。
5、在剩下的两行两列中,右上角数字7刚好是要找的数字。
同样,也可以选取左下角的数字。但是不能选取左上角或右下角的数字。以左上角的数字1为例,由于1 小于7,7应该在1的右边或者下边,我们不能剔除1所在的列也不能剔除1所在的行,这样我们不能缩小范围查找。
例如下面的二维数组就是每行、每列都递增的数组。如果在这个数组中查找数字7,则返回true;如果在这个数组中查找数字13,则返回false。
思路:1、选取数组右上角的数字4。由于9大于7,并且9是第4列第一个数字,所以7不可能在9所在的列。
2、接下来分析剩下的三列,在剩下的矩阵中,右上角的数字8同样大于7,所以7也不可能在8所在的列,剔除该列。
3、接下来分析剩下的两列,右上角的数字2小于7,所以7可能在2的下边。剔除2所在的行。
4、接下来分析剩下的三行两列,右上角数字4小于7,剔除4所在的行。
5、在剩下的两行两列中,右上角数字7刚好是要找的数字。
#include<iostream> #include<assert.h> using namespace std; bool Find(int arr[][4], int rows, int cols, int number) { assert(arr); if (rows > 0 && cols > 0) { //选取数组右上角的数字 int row = 0; int col = cols - 1; while (row < rows && col >= 0) { if (arr[row][col] == number) //如果该数字等于要查找的数字,返回true { return true; } else if (arr[row][col] > number)//如果该数字大于要查找的数字,剔除该数字所在的列 { --col; } else //如果该数字小于要查找的数字,剔除该数字所在的行 { ++row; } } } return false; } int main() { int arr[][4] = { { 1, 2, 8, 9 }, { 2, 4, 9, 12 }, { 4, 7, 10, 13 }, { 6, 8, 11, 15 }}; bool ret=Find(arr,4,4,0); printf("%d\n", ret); return 0; }
同样,也可以选取左下角的数字。但是不能选取左上角或右下角的数字。以左上角的数字1为例,由于1 小于7,7应该在1的右边或者下边,我们不能剔除1所在的列也不能剔除1所在的行,这样我们不能缩小范围查找。
相关文章推荐
- Redis中实现查找某个值的范围
- Lua中使用二维数组实例
- 批量文件查找替换功能的vbs脚本
- WinForm实现按名称递归查找控件的方法
- 一个用vbs查找硬盘所有分区中的指定程序的代码
- 浅析Node.js查找字符串功能
- C++二分法在数组中查找关键字的方法
- C++中字符串查找操作的两则实例分享
- C#使用二维数组模拟斗地主
- WinForm自定义函数FindControl实现按名称查找控件
- Shell脚本学习指南之查找与替换介绍
- php实现指定字符串中查找子字符串的方法
- C#二维数组基本用法实例
- C#查找对象在ArrayList中出现位置的方法
- jquery 查找新建元素代码
- Oracle 查找与删除表中重复记录的步骤方法
- javascript的日期对象、数组对象、二维数组使用说明
- PHP 如何获取二维数组中某个key的集合
- 改写函数实现PHP二维/三维数组转字符串
- SQL Server根据分区表名查找所在的文件及文件组实现脚本