题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思路:从数组右上角的数字开始查找,若该数字等于要查找的数,则查找结束;若该数字大于要查找的数,则删除该列;若该数字小于要查找的数,则删除该行。代码如下:
bool Find(int* matrix, int rows, int columns, int number)
{
bool found = false; //定义变量found,初始值为false
if(matrix != nullptr && rows >0 && columns >0) //判断指针是否为空指针,并且数组的行和列是否大于0
{
int row = 0; //定义变量row,初始值为0,表示第一行
int column = columns - 1; //定义变量column,初始值为columns - 1,表示最右列
while(row < rows && column >=0)
{
if(matrix[row * columns +column] == number) //判断下标为row * columns +column的数是否等于要查找的数
{
found = true; //若该数字等于要查找的数,则查找结束,返回found值true
break;
}
else if(matrix[row * columns +column] > number) //若大于要查找的数,则删除该列,继续向左查找
-- column;
else //若小于要查找的数,则删除该行,即++row,继续向下查找
++ row;
}
}
return found;
}
以上是从右上角的数字开始查找,当然也可以从左下角开始查找(但是不能从左上角或者右下角开始查找,because这样做不能缩小查找的范围)以下是我自己改写的从左下角开始查找的代码,如有错误请不吝赐教。
bool Find(int* matrix, int rows, int columns, int number) //思路:相等,则返回true;大于,则删除行;小于,则删除列
{
bool found = false;
if(matrix != nullptr && rows >0 && columns >0)
{
int column = 0; //定义变量column,初始值为0,表示第一列
int row = rows - 1; //定义变量row,初始值为rows-1,表示最后一行
while(row >=0 && column < columns)
{
if(matrix[row * columns +column] == number) //矩阵下标计算式与上同
{
found = true; //若该数字等于要查找的数,则查找结束,返回found值true
break;
}
else if(matrix[row * columns +column] > number) //若大于要查找的数,则删除该行,继续向上查找
-- row;
else
++ column; //若小于要查找的数,则删除该列,继续向右查找
}
}
return found;
}
我一直不明白指针指向数组的下标row * columns +column 是如何计算得来的,这貌似是个数学问题,求赐教!