您的位置:首页 > 其它

二维数组中的查找

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刚好是要找的数字。



#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所在的行,这样我们不能缩小范围查找。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二维数组 查找