题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入一个这样的二维数组和一个整数,判断数组中是否含有该整数。
例如下面的数组:若输入7,则返回true,输入5,则返回false
1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15
按照一般的想法,从数组中选取一个数字与输入的数进行比较,分三种情况分析,第一种刚好相等,则结束查找,第二种是比输入的数小,则应该在选取的数的右边或者下边继续选取一个数与输入的数再进行比较,第三种比输入的数大,则从选取的数的左边或者上边选取一个数继续与输入的数进行比较。由于要查找的数可能在两个区域中出现,而且还有重叠的区域,所以问题看起来就复杂了。
所以要换另一个中思路。不妨从数组的右上角的数9开始比较。假设输入的数是7。9>7,根据题意9又是第四列中最小的数,于是第四列数可以全部被排除。这样分析剩下的三列。再次选取右上角的数8与7进行比较。发现8>7,再次去掉第三列。剩下四行两列数。继续选择右上角的数2与7比较。发现2<7,2又是第一行中最大的数,于是可以排除掉第一行中所有的数。剩下三行两列数。继续比较,知道应该去掉第二行数。此时选择剩下的两行两列的右上角的数,发现与7相等,则查找成功,输出true。
将整个思路厘清后,再写代码就不是一件很难的事了。大致的代码参考如下:
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;
else
++row;
}
}
}