面试题3:二维数组中查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一行都按照从上往下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个数,判断数组中是否含有该整数。
例如下面的二维数组就是每行,每列都是按照递增的顺序排序,如果在这个数组中查找7,则返回true,如果查找5,则返回false。
-
2 8 9
-
4 9 12
-
7 10 13
6 8 11 15
如果按照常规的方法,我们是可以一次查找的,但是这种方法效率不高,时间复杂度
很大,并且并没有用到该数组的规律。
因此我的解题思路是:
-
我们可以先从右上角开始查找;
-
如果比它大的话就在该数的这一列下面
-
如果比他小的话就在该数的前一列
我的代码如下:
#include<stdio.h>
#include<assert.h>
#define ROW 4
#define COL 4
bool FindNumber(int arr[][COL],int number)
{
assert(arr != NULL);
int find=false;
int i=0;
int j=COL-1;
for(; i<ROW,j<COL;)
{
if(i>ROW || j<0)
{
break;
}
else if(number == arr[i][j])
{
find = true;
break;
}
else if(number > arr[i][j])
{
i++;
}
else if(number < arr[i][j])
{
j--;
}
}
return find;
}
int main()
{
int arr[ROW][COL]={1,2,8,9,
2,4,9,12,
4,7,10,13,
6,8,11,15};
inta=FindNumber(arr,7);
if(a == true)
{
printf("此数组中有该数字\n");
}
else
{
printf("此数组中没有该数字\n");
}
return 0;
}
当查找 7 时结果:
当查找 5 时结果: