面试题3:二维数组中的查找
一:题目描述
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
例如下面的二位数组,若查找数字7,则返回true;如果查找数字5,则返回false
二:分析问题
1.举例分析
假设我们现在要查找的数字是7。首先我们我们选取数组右上角的数字9。因为9大于7,且9所在的这一列是从上到下递增的,因此我们舍去数字9所在的这一列。
接着我们继续选取数组右上角的数字8,因为8大于7,且8所在的这一列是从上到下递增的,因此我们舍去数字8所在的这一列。
接着我们继续选取数组右上角的数字2,因为2小于7,因此7可能在2的右面,也可能在2的下面,但由于之前的步骤,我们已经将2右面的列都舍去了,因此现在7只可能在2的下面了,因此我们把2所在的这一行舍去。
接着我们继续选取数组右上角的数字4,因为4小于7,因此7可能在4的右面,也可能在4的下面,但由于之前的步骤,我们已经将4右面的列都舍去了,因此现在7只可能在4的下面了,因此我们把4所在的这一行舍去。
此时,右上角的数字正好是我们要寻找的数字7,于是返回true。
2.解题思路
首先选取数组中右上角的数字,如果该数字等于要查找的数字,查找过程结束,如果该数字大于要查找的数字,剔除这个数字所在的列,如果该数字小于要查找的数字,剔除这个数字所在的行。也就说,每次查找都从这个数组的右上角开始,接着判断这个数字与要查找的数的关系,直到查到为止,或者查找范围为空。
三.代码
#include<stdio.h>
bool Find(int* arr, int rows, int columns, int number)
{
/*row:数组的行数 columns:数组的列数 number:要寻找的数*/
bool found = false;
if (arr != NULL && rows > 0 && columns > 0)
{
int row = 0;//第一行
int column = columns - 1;//最后一列
while (row < rows && column >= 0)
{
if (arr[row * columns + column] == number)
{
found = true;
break;
}
else if (arr[row * columns + column] > number)
{
--column;
}
else
{
++row;
}
}
}
return found;
}
int main()
{
int arr[16] = { 1,2,8,9,2,4,9,12,4,7,10,13,6,8,11,15 };
if (Find(arr, 4, 4, 12))
{
printf("Yes!\n");
}
else
{
printf("No!\n");
}
return 0;
}
运行结果