二维数组中的查找
1、题目
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
输入参数:一个二维数组matrix,数组的行数rows,数组的列数columns,寻找的整数number
输出参数:返回 true 或 false
2、解题
解这道题的关键在于每次都选取右上角的元素。
在分析这个问题的时候,由于二维数组已经按从上到下、从左到右的顺序排好了序,因此任意从数组中取出一个元素 x 与要寻找的整数 num 比较后无非三种情况:
- 二者相等
- x < num,num 在 x 的右边或下面
- x > num,num 在 x 的左边或上面
这时我们就出现了两个不同方向的选择,即便往下一步,还是存在两个选择,问题变得非常复杂。
因此,我们要做的就是找到数组中的某个特定元素x,让它在和num比较后只有一个方向的选择。
二维数组中,有两个位置满足这一条件,一个是右上角,另一个是左下角,通常我们选取右上角的元素作为x。
解题的具体步骤如下:
-
首先选取数组中右上角的数字 x。
- 如果 x = num,查找过程结束
- 如果 x > num,剔除 x 所在的列
- 如果 x < num,剔除 x 所在的行
-
不断缩小查找范围,直到找到 num 或者 查找范围等于空为止
3、代码
bool Find(int* matrix, int rows, int columns, int number){
//设置寻找变量
bool found = false;
//鲁棒性检查
if(matrix != nullptr && rows > 0 && columns > 0){
//行、列初始化
int row = 0;
int col = columns - 1;
//开始进行区域查找
while(row < rows && columns >= 0){
//当x = num时
if(matrix[row * columns + col] == number){
found = true;
return found;
}
//当x > num时
else if(matrix[row * columns + col] > number)
col--;
//当x < num时
else
row++;
}
}
return found;
}
4、注意点
-
需要对传入的参数进行鲁棒性检查
-
为了定位二维数组右上角的元素,需要初始化一个row和col,而不是使用传入的行列参数
-
循环区域查找的条件是 行不超过数组的行数,列不小于0