题目
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
问题分析
应当从具体问题入手,通过分析简单具体的例子,发现普遍的规律。
现在假定,我们要从二维数组
1 7 14 21
3 8 15 22
5 9 16 23
7 17 23 24
中检索是否存在数字7。
按照从右上方,列优先的顺序检索该数组。
1. 在检索17的时候,因为21大于17,故可剔除第四列。
2. 在检索14的时候,因为14小于17,故可剔除第一行,相当于更新行号和列号后重新执行而已。则剩下
3 8 15
5 9 16
7 17 23
3. 在检索15的时候,因为15小于17,故可剔除第一行,只剩下
5 9 16
7 17 23
4. 在检索16的时候,因为16小于17,故可剔除第一行,只剩下
7 17 23
5. 在检索到23的时候,因为23大于17,故可剔除第三列,只剩下
7 17
6. 检索到17,返回。
代码实现如下:
#include <stdio.h>
#define M 4
#define N 4
int FindNumber(int array[M][N],int rows,int columns,int number)
{
if(array!=NULL && rows>0 && columns>0)
{
int col=columns-1,row=0;
while(col>=0 && row<rows)
{
if(array[row][col]>number)
{
col--;
continue;
}
else if(array[row][col]<number)
{
row++;
continue;
}
else
return 1;
}
return 0;
}
else
return 0;
}
int main(void)
{
int a[M][N]={
{1,7,14,21},{3,8,15,22},{5,9,16,23},{7,17,23,24}
};
int num;
printf("要测试的数组为:\n");
for(int i=0;i<M;i++)
{
for(int j=0;j<N;j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
printf("请输入要查找的数:");
while(scanf("%d",&num))
{
if(FindNumber(a,M,N,num))
printf("该数存在\n");
else
printf("该数不存在\n");
printf("请输入要查找的数:");
}
return 0;
}
结果如下:
$ ./MyFindNumberInTwoArrays.exe
要测试的数组为:
1 7 14 21
3 8 15 22
5 9 16 23
7 17 23 24
请输入要查找的数:17
该数存在
请输入要查找的数:23
该数存在
请输入要查找的数:22
该数存在
请输入要查找的数:10
该数不存在
请输入要查找的数:6
该数不存在
请输入要查找的数:
来源:https://www.cnblogs.com/longzhongren/p/4338946.html