在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。现在我们要做一件事情:输入这样一个二维数组和一个整数,判断数组中是否含有该整数。
因为该数组从左到右递增、从上到下递增,所以我们可以在数组中选择一个基准与要找的数进行比较大小,如果基准与其相等,则找到;如果基准比其大,则在基准的上方或者左方查找;如果基准比其小,则在基准的下方或者右方进行查找。
如下:选择基准为4,找7;由于7>4我们确定下次找的范围为4的右方和下方,深紫色是重复的。
但是这样的查找给我们带来了不便,因为每次比较完之后,下次要查找的区域有重叠,而且没有规律。
所以我们换一种思路,开始选取右上角或者左下角的数作为基准进行比较,这样的话,借助数组中从左到右递增、从上到下递增,就可以一步一步进行剔除基准所在行或者列。
这里需要注意一下,不能选择左上方或者右下角的数做为基准,因为左上角的数比数组中任意位置的数小,无法做选择;右下角的数比数组中的任意位置的数都大,无法做选择。
1)、每次以右上角的数作为基准
2)、每次以左下角的数左为基准
代码:
#include<stdio.h>
bool Find2(int *matrix,int rows,int columns,int number)//选取左下边的数字进行比较
{
bool found=false;
if(matrix!=NULL && rows>0 && columns>0)
{
int row=rows-1;
int column=0;
while(row>=0 && column<columns)
{
if(matrix[row * columns+column]==number)
{
found=true;
break;
}
else if(matrix[row*columns+column]>number)
{
--row;
}
else
{
++column;
}
}
}
return found;
}
bool Find1(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 arr[]={1,2,8,9,2,4,9,12,4,7,10,13,6,8,11,15};
if(Find2(arr,4,4,15))
printf("该数组中有\n");
else
printf("没有\n");
if(Find2(arr,4,4,1))
printf("该数组中有\n");
else
printf("没有\n");
if(Find2(arr,4,4,7))
printf("该数组中有\n");
else
printf("没有\n");
if(Find2(arr,4,4,20))
printf("该数组中有\n");
else
printf("没有\n");
if(Find2(arr,4,4,-2))
printf("该数组中有\n");
else
printf("没有\n");
if(Find2(arr,4,4,5))
printf("该数组中有\n");
else
printf("没有\n");
if(Find2(arr,4,4,NULL))
printf("该数组中有\n");
else
printf("没有\n");
return 0;
}