c语言——杨氏矩阵

题目:有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。
要求:时间复杂度小于O(N)。

代码:

思路1:一行一行比较,当遇到比num更大的数字时,转入下一行继续比较

int num_find(int arr[5][5], int* px, int* py, int num)
{
	int x = 0;
	int y = 0;
	while (num != arr[x][y])
	{
		if (arr[x][y] < num && y < *py)
		{
			y++;
		}
		else if (x < *px)
		{
			x++;
			y = 0;
		}
		else
			return 0;
	}
	*px = x;
	*py = y;
	return 1;
}

int main()
{
	int arr[5][5] = { {1,2,4,7,9},{2,3,5,11,15},{5,8,11,15,20},{6,7,12,16,23},{8,9,14,18,25} };
	int num = 0;
	scanf("%d", &num);
	int x = 5;
	int y = 5;
	int ret = num_find(arr, &x, &y, num);
	if (ret == 1)
		printf("找到了,下标为:%d %d\n", x, y);
	else
		printf("没找到\n");
	return 0;
}

思路2:右上角是一行中最大的数,同时是一列中最小的数。将待查找的数字与二维数组右上角比较,如果比右上角数字小,列数减1;如果比右上角数字大,行数加1。依次比较。

int num_find(int arr[3][3], int r, int c, int num)
{
	int x = 0;
	int y = c - 1;
	while (x < r && y >= 0)
	{
		if (arr[x][y] < num)
			x++;
		else if (arr[x][y] > num)
			y--;
		else
			return 1;
	}
	return 0;
}


int main()
{
	int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
	int num = 0;
	scanf("%d", &num);
	int ret = num_find(arr, 3, 3, num);
	if (ret == 1)
		printf("找到了\n");
	else
		printf("没找到\n");
	return 0;
}

思路2增加打印下标

int num_find(int arr[3][3], int* px , int* py, int num)
{
	int x = 0;
	int y = *py - 1;
	while (x < *px && y >= 0)
	{
		if (arr[x][y] < num)
			x++;
		else if (arr[x][y] > num)
			y--;
		else
		{
			*px = x;
			*py = y;
			return 1;
		}
	}
	return 0;
}


int main()
{
	int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
	int num = 0;
	scanf("%d", &num);
	int x = 3;
	int y = 3;
	int ret = num_find(arr, &x, &y, num);
	if (ret == 1)
		printf("找到了,下标是:%d %d\n", x, y);
	else
		printf("没找到\n");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/minLi_/article/details/129881320