您的位置:首页 > Web前端

剑指offer——二维数组中的查找

2017-03-19 11:10 337 查看
在一个二维数组中,每一行都按照从左到右的顺序递增排序,每一列都按照从上到下的顺序递增排序,在这个数组中查找一个数字,如果找到了,返回true,如果未找到,返回false。

例如:

数组如下:

1 2 8 9

2 4 9 12

4 7 10 13

6 8 11 15

在解决这个问题时,首先想到最简单,最直接的方法,就是从上到下依次搜索,直到找到要查找的数字,或者查找完所有的数字,没有与之相同的数字,即就是没有找到。

代码如下:

#include<iostream>
#include<vector>
#define N 4
using namespace std;

bool Find(int array

, int number)
{
bool find = false;
if(array != NULL)
{
int i = 0;
int j = 0;
for(i=0; i<N; i++)
{
for(j=0; j<N; j++)
{
if(array[i][j] == number)
{
find = true;
break;
}
}
}
}

return find;
}

void FunTest()
{
int array

;
int i = 0;
int j = 0;

for(i=0 ; i<N ; i++)
{
for(j=0 ; j<N ; j++)
{
cin>>array[i][j];
}
}

bool ret = Find(array, 7);
cout<<ret<<endl;
}

int main()
{
FunTest();
system("pause");
return 0;
}


这个方法,虽然能做出来,但是浪费了时间,而且没有做到考虑数组递增的特性,增加了时间复杂度。

接下来考虑如下一种方法:

步骤:

(1)首先选取数组中右上角的数字;

(2)如果数字等于要查找的数字,查找结束;如果数字小于要查找的数字,剔除数字所在行;如果数字大于要查找的数字,剔除数字所在列;

(3)重复循环上述步骤,直到找到要查找的数字,或者查找范围为空。

有以下三种结果:

(1)当数组中选取的数字和要查找的数字相等时,就结束查找过程;

(2)如果选取的数字小于要查找的数字时,根据数组排序的规则,要查找的数字在选取数字的右边或者下边;

(3)如果选取的数字大于要查找的数字时,根据数组排序的规则,要查找的数字在选取数字的左边或者上边;

代码如下:

bool Find(int *array,int rows, int columns, int number)
{
bool find = false;
if(array != NULL && rows > 0 && columns > 0)
{
int row = 0;
int column = 0;
while(row < rows && column >= 0)
{
if(array[row * column + column] == number)
{
find = true;
break;
}
else if(array[row * column + column] > number)
{
--column;
}
else
{
++row;
}
}
}

return find;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二维数组 搜索