问题描述:在一个二维数组中,每一行按照从左道右递增的顺序排列,每一列按照从上到下递增的顺序排列。给定一个数值,判断二维数组中是否存在这个数字。
思路分析:首先选取数组中右上角的数字,如果该数字等于要查找的数字,查找过程结束;如果小于要查找的数字,那么去除这个数字所在的列;如果大于要查找的数字,那么去除这个数字所在的行,迭代进行,最终得出是否存在这个数字。
代码如下:
#include <iostream>
using namespace std;
class Two_DimenArray
{
public:
Two_DimenArray();
Two_DimenArray(int row1, int cloumn1);
Two_DimenArray(int* intialArray,int irow, int icolumn);
~Two_DimenArray();
int getRow();
int getColumn();
int getValue(int m, int n);
bool find(int number);
private:
int row;
int column;
int* valueArray;
};
Two_DimenArray::Two_DimenArray()
{
row=0;
column=0;
valueArray=new int[0];
}
Two_DimenArray::Two_DimenArray(int row1, int column1)
{
row=row1;
column=column1;
valueArray=new int[row1*column1];
}
Two_DimenArray::Two_DimenArray(int* intialArray,int irow, int icolumn)
{
//从语义上来讲,函数参数中的指针不应该用const修饰,
//既然用指针传递,就应该意味着参数会被修改,
//如果函数体不修改参数,应该用const引用或者传值,从而intinalArray不用const
valueArray=intialArray;
row=irow;
column=icolumn;
}
Two_DimenArray::~Two_DimenArray()
{
delete []valueArray;
valueArray=NULL;
}
int Two_DimenArray::getValue(int m,int n)
{
return valueArray[m*row+n];
}
int Two_DimenArray::getRow()
{
return row;
}
int Two_DimenArray::getColumn()
{
return column;
}
//判断数组中是否存在与number相同的数
bool Two_DimenArray::find(int number)
{
bool found=false;
if(valueArray!=NULL && row>0 && column>0)
{
int row0=0;
int column0=column-1;
while(row0<row&&column>=0)
{
if(valueArray[row0*row+column0]==number)
{
found=true;
break;
}
else if(valueArray[row0*row+column0]>number)
column0--;
else
row0++;
}
}
return found;
}
int main()
{
int irow=3,icolumn=3;
int a[]={1,2,3,4,5,6,7,8,9};
Two_DimenArray b(a,irow,icolumn);
int number;
cout<<"请输入您要查找的数字:"<<endl;
cin>>number;
bool found=b.find(number);
if(found)
cout<<"找到数字!"<<endl;
else
cout<<"无此数字!"<<endl;
return 0;
}