今天看了《剑指Offer》的面试题3,还是很有收获的。题目是一个二维数组,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
初看的时候,我也是看得云里雾里。但是当作者将思路引导了右上角的时候,顿时就有豁然开朗的感觉。正是因为每一行从左到右依次递增,每一行从上到下依次递增,这样的话,抓住右上角的数字与待查找数字进行比较,就相当于抓住了“牛鼻子”。若右上角数字等于待查找数字,那再好不过了,直接返回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(column>=0 && row<rows)
{
if( matrix[row*columns+column] == number)
{
found = true; break;
}
else if(matrix[row*columns+column]>number)
{
column--;
}
else
{
row++;
}
}
}
return found;
}
后来,作者又提到了也可以使用二维数组的左下角的数字作为参考。采用左下角数字的话,正好与右上角的情形相反。作者没有给出代码,这里给出我自己写的。
bool Find(int* matrix, int rows, int columns, int number)
{
bool found = false;
if(matrix != NULL && rows>0 && columns>0 )
{
int row = rows-1;
int column = 0;
while(matrix != NULL && row>=0 && column<columns)
{
if( matrix[row*columns] == number)
{
found = true; break;
}
else if(matrix[row*columns]>number)
{
row--;
}
else
{
column++;
}
}
}
return found;
}