【C语言】在杨氏矩阵中查找一个数字是否存在

题目:有一个二维数组(杨氏矩阵)数组的每行从左到右是递增的,每列从上到下是递增的。在这样的数组中查找一个数字是否存在。时间复杂度小于O(N)。

此题的解决思路为:由于数组的每行从左到右是递增的,每列从上到下是递增的,因此右上角的这个数为该数所在这一行最大的数,为该数所在这一列最小的数,我们以数组右上角的这个数为基准进行比较。若我们要查找的这个数大于右上角的这个数,而右上角的这个数是这一行中最大的数,所以我们可以去掉一行数据,同理,若我们要查找的这个数小于右上角的这个数,而右上角的这个数是这一列中最小的数,所以我们可以去掉一列数据。

此时我们定义了一个函数为find,如果找到我们要查找的数据我们带回下标,并返回1,若没有找到则返回0。这样在主函数中用ret接收find的返回值即可。

但是这里需要注意:我们要带回所查找数据的下标,这里我们要用到返回型参数。我们在传参数时将x和y的地址传递给find函数,find函数用指针px和py接收,并使用内部定义的x和y寻找我们要查找的数据,若找到了,我们令*px=x,*py=y,这样就很好的将我们所查找的元素下标带出。
 

#include <stdio.h>
#include <stdlib.h>
int find(int arr[3][3], int *px, int *py, int k)
{
	int x = 0;
	int y = *py - 1;
	while (x < *px && y >= 0)
	{
		if (arr[x][y]<k)
			x++;//若某一行的最右侧元素小于我们要查找的值,我们则去掉一行
		else if (arr[x][y]>k)
			y--;//若某一行的最右侧元素大于我们要查找的值,我们则去掉一列
		else
		{
			//返回型参数
			//这里找到的x和y就是我们的下标
			*px = x;//把x的值赋给*px,*px就是外面的x
			*py = y;//把y的值赋给*py,*py就是外面的y
			return 1;
		}
	}
	return 0;
}
int main()
{
	int arr[3][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	int k = 7;
	int x = 3;
	int y = 3;
	int ret = find(arr, &x, &y, k);
	if (ret == 1)
	{
		printf("找到了:>%d %d\n",x,y);
	}
	else
	{
		printf("没有找到\n");
	}
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Miss_Monster/article/details/86018288