C语言:杨氏矩阵中查找某数(时间复杂度小于O(N))

题目:

有一个数字矩阵二维数组),

矩阵的每行从左到右是递增的
矩阵从上到下是递增的
请编写程序在这样的矩阵中查找某个数字是否存在,

要求:时间复杂度小于O(N)

                    

 =========================================================================

                       

思路:

总体思路:

(1).

自定义函数:

           

实现逻辑

因为是杨氏矩阵,所以一行中最右边的数是最大的

扫描二维码关注公众号,回复: 15847736 查看本文章

这个最大值如果比要找的值都小的话,那就可以排除这一行

列也是同理

                  

函数参数接收 二维数组名要查找的数

存放矩阵行数的变量的指针(地址)存放矩阵列数的变量的指针(地址)

                  

通过两个变量找出二维数组第一行的最大值

              

使用 while循环 ,如果未查找到 二维数组的最大行数 且 列数未到最小列

行的最右边的数是最大的列逐渐判断直到最小列

继续查找

          

(2).

while循环中

                

使用 if条件判断语句判断第一行最大值是否小于要找的值

          

如果小于那么这一行不可能有要查找的值,可以排除这一行指针移到下一行

          

如果最大值大于要查找的值,那么该值就在这一行,逐渐移动列数在改行进行查找

          

如果要查找的值直接就和该行最大值相等通过调整行数和列数找到了

          

通过 矩阵的行数列数变量的指针 设置找到的行数和列数

                 

跳出循环还未找到的话,则将k的“坐标”设置为(-1,-1)表未找到

                       

(3).

主函数:

          

给出一个杨氏矩阵二维数组),

            

输入要在矩阵中找的数

               

设置矩阵的 行 和 列

             

使用自定义函数进行查找

函数参数二维数组名要查找的数

矩阵行数变量的指针(地址)矩阵列数变量的指针(地址)

                      

通过函数的查找情况打印相应情况

                


                 

第一步:

自定义函数:

           

实现逻辑

因为是杨氏矩阵,所以一行中最右边的数是最大的

这个最大值如果比要找的值都小的话,那就可以排除这一行

列也是同理

                  

函数参数接收 二维数组名要查找的数

存放矩阵行数的变量的指针(地址)存放矩阵列数的变量的指针(地址)

                  

通过两个变量找出二维数组第一行的最大值

              

使用 while循环 ,如果未查找到 二维数组的最大行数 且 列数未到最小列

行的最右边的数是最大的列逐渐判断直到最小列

继续查找

                     

实现代码:

#include <stdio.h>

//自定义函数:
void young_table_search(int arr[3][3], int k, int* px, int* py)
{
	//通过两个变量找出二维数组第一行的最大值:
	//行和列是从0开始的,
	int x = 0; //二维数组的行,从第一行进行查找
	int y = *py - 1; //二维数组的列,从最大列开始查找,

	//使用 while循环 进行查找:
	while (x<=*px-1 && y>=0)
		//x<=*px-1  -- 未查找到最大行数
		//y>=0  --  未调整到最小列数
	{


	}
}

int main() 
{


	return 0;
}

实现图片:

                 


                 

第二步:

在while循环中:

                

使用 if条件判断语句判断第一行最大值是否小于要找的值

          

如果小于那么这一行不可能有要查找的值,可以排除这一行指针移到下一行

          

如果最大值大于要查找的值,那么该值就在这一行,逐渐移动列数在改行进行查找

          

如果要查找的值直接就和该行最大值相等通过调整行数和列数找到了

          

通过 矩阵的行数列数变量的指针 设置找到的行数和列数

                 

跳出循环还未找到的话,则将k的“坐标”设置为(-1,-1)表未找到

                     

实现代码:

#include <stdio.h>

//自定义函数:
void young_table_search(int arr[3][3], int k, int* px, int* py)
{
	//通过两个变量找出二维数组第一行的最大值:
	//行和列是从0开始的,
	int x = 0; //二维数组的行,从第一行进行查找
	int y = *py - 1; //二维数组的列,从最大列开始查找,

	//使用 while循环 进行查找:
	while (x<=*px-1 && y>=0)
		//x<=*px-1  -- 未查找到最大行数
		//y>=0  --  未调整到最小列数
	{
		if (arr[x][y] < k)
			//第一行最大值 小于 k
		{
			x++; //排除这一行,移到下一行
		}
		else if (arr[x][y] > k)
			//第一行最大值 大于 k
		{
			y--; //k就在这一行,移到列进行查找
		}
		else
			//找到了:把k的行和列赋给指针px和py
		{
			*px = x;
			*py = y;
			return;
		}
	}
	//自定义未找到的情况:
	*px = -1;
	*py = -1;
}

int main() 
{


	return 0;
}

实现图片:

                 


                 

第三步:

主函数:

          

给出一个杨氏矩阵二维数组),

            

输入要在矩阵中找的数

               

设置矩阵的 行 和 列

             

使用自定义函数进行查找

函数参数二维数组名要查找的数

矩阵行数变量的指针(地址)矩阵列数变量的指针(地址)

                      

通过函数的查找情况打印相应情况

                     

实现代码:

#include <stdio.h>

//自定义函数:
void young_table_search(int arr[3][3], int k, int* px, int* py)
{
	//通过两个变量找出二维数组第一行的最大值:
	//行和列是从0开始的,
	int x = 0; //二维数组的行,从第一行进行查找
	int y = *py - 1; //二维数组的列,从最大列开始查找,

	//使用 while循环 进行查找:
	while (x<=*px-1 && y>=0)
		//x<=*px-1  -- 未查找到最大行数
		//y>=0  --  未调整到最小列数
	{
		if (arr[x][y] < k)
			//第一行最大值 小于 k
		{
			x++; //排除这一行,移到下一行
		}
		else if (arr[x][y] > k)
			//第一行最大值 大于 k
		{
			y--; //k就在这一行,移到列进行查找
		}
		else
			//找到了:把k的行和列赋给指针px和py
		{
			*px = x;
			*py = y;
			return;
		}
	}
	//自定义未找到的情况:
	*px = -1;
	*py = -1;
}

int main() 
{
	//给出一个杨氏矩阵:
	int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
	//					1 2 3
	//					4 5 6
	//					7 8 9

	//输入要找的数:
	int k = 0;
	scanf("%d", &k);

	//设置矩阵的行和列:
	int x = 3; //矩阵的行
	int y = 3; //矩阵的列

	//使用自定义函数进行查找:
	young_table_search(arr, k, &x ,&y);

	//根据情况大于相应情况:
	if (x==-1 && y==-1)
		//未找到
	{
		printf("未找到");
	}
	else
		//找到了
	{
		printf("找到了,它的下标为:第%d行 第%d列", x, y);
	}

	return 0;
}

实现图片:

                       

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                        

最终代码和实现效果

最终代码:

#include <stdio.h>

//自定义函数:
void young_table_search(int arr[3][3], int k, int* px, int* py)
{
	//通过两个变量找出二维数组第一行的最大值:
	//行和列是从0开始的,
	int x = 0; //二维数组的行,从第一行进行查找
	int y = *py - 1; //二维数组的列,从最大列开始查找,

	//使用 while循环 进行查找:
	while (x<=*px-1 && y>=0)
		//x<=*px-1  -- 未查找到最大行数
		//y>=0  --  未调整到最小列数
	{
		if (arr[x][y] < k)
			//第一行最大值 小于 k
		{
			x++; //排除这一行,移到下一行
		}
		else if (arr[x][y] > k)
			//第一行最大值 大于 k
		{
			y--; //k就在这一行,移到列进行查找
		}
		else
			//找到了:把k的行和列赋给指针px和py
		{
			*px = x;
			*py = y;
			return;
		}
	}
	//自定义未找到的情况:
	*px = -1;
	*py = -1;
}

int main() 
{
	//给出一个杨氏矩阵:
	int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
	//					1 2 3
	//					4 5 6
	//					7 8 9

	//输入要找的数:
	int k = 0;
	scanf("%d", &k);

	//设置矩阵的行和列:
	int x = 3; //矩阵的行
	int y = 3; //矩阵的列

	//使用自定义函数进行查找:
	young_table_search(arr, k, &x ,&y);

	//根据情况大于相应情况:
	if (x==-1 && y==-1)
		//未找到
	{
		printf("未找到");
	}
	else
		//找到了
	{
		printf("找到了,它的下标为:第%d行 第%d列", x, y);
	}

	return 0;
}

实现效果

猜你喜欢

转载自blog.csdn.net/weixin_63176266/article/details/131878381