题目描述:
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
输入:
输入可能包含多个测试样例,对于每个测试案例,
输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的矩阵的行数和列数。
输入的第二行包括一个整数t(1<=t<=1000000):代表要查找的数字。
接下来的m行,每行有n个数,代表题目所给出的m行n列的矩阵(矩阵如题目描述所示,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
输出:
对应每个测试案例,
输出”Yes”代表在二维数组中找到了数字t。
输出”No”代表在二维数组中没有找到数字t。
分析:
根据题目我们可以得出规律:首先选取数组右上角的数字。如果该数字是要查找的数字,查找过程结束;如果该数字大于要查找的数字,剔除这个数字所在列;如果该数字小于要查找的数字,剔除该数字所在的行。每一步都可以缩小查找范围,直到查找到该数字,或者查找范围为空。
具体代码如下:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define MAXN 1000
int map[MAXN*MAXN];
bool Find(int* matrix,int rows,int columns,int number)
{
bool found = false;
if(matrix != NULL && rows > 0 && columns > 0)
{
int row = 0;
int column = columns - 1;
while(row < rows && column >= 0)
{
if(matrix[row*columns+column] == number)
{
found = true;
break;
}
else if(matrix[row*columns+column] > number)
{
column--;
}
else
{
row++;
}
}
}
return found;
}
int main()
{
int m, n, t;
while(scanf("%d%d",&m,&n) != EOF)
{
memset(map,0,sizeof(map));
scanf("%d",&t);
for(int i = 0; i < m*n; i++)
{
scanf("%d",&map[i]);
}
if(Find(map,m,n,t))
printf("Yes\n");
else printf("No\n");
}
return 0;
}
当然也可以选取左下角来进行剔除,原理是一样的,这里就不赘述了。