有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。
要求:时间复杂度小于O(N);
如图所示就是杨氏矩阵,每一行元素从左到右依次递增;每一列从上到下依次递增
线性搜索算法---按照这特性,首先是从右上角开始,因为递增,右上角也就是第一列最大的数,每次将查找值与右上角元素进行比较,若查找值小于右上角值,则减一列,否则去减一行。
比如待搜索元素为10,右上角元素为15,那么右上角元素所在列删除(因为,列逐渐递增),同理11大于10因此又删除一列,然后7小于10因此是删除一行。最差的情况下,查找从右上角直到左下角对于x*y矩阵,时间复杂度为O(x+y)
int Find(int arr[3][3], int m, int n, int k)
{
while (m<4&&n>=0)
{
if (k < arr[m][n])
n--;
else if (k > arr[m][n])
m++;
else
return 1;
}
return 0;
}
int main()
{
int arr[3][3] = { {1,4,7},{2,5,8},{3,6,9} };
int m=0, n=2, k;
while (scanf("%d", &k) != EOF)
{
int ret = Find(arr, m, n, k);
if (ret == 1)
printf("找到了\n");
else
printf("没找到\n");
}
return 0;
}