C语言实现对杨氏矩阵中元素的查找(要求时间复杂度小于O(N))

杨氏矩阵:矩阵的每行从左到右是递增的,矩阵从上到下也是递增的。
比如 1 2 3
4 5 6
7 8 9
这个就是一个杨氏矩阵
要求查找某个数字是否存在,若存在取出该元素的下标
解题思路:假使我们要找元素7,我们可以先从第一行的第3个元素和要查找的元素进行比较,3比7小,那么本行就不会有要查找的元素,我们将行数+1,在向下寻找,假如我们现在查找到了元素9,比7大,那么就执行列数-1,直到找到我们要查找的元素。
源码如下:
#include<stdio.h>
int find(int p[][3],int *r,int *c,int n)//使用指针接收行和列,及可以使用行和列的值,又可以将其改变然后输出
{
int x = 0;
int y = (*c)-1;//我们假使从第一行第3列开始比较,数组下标从0开始,所以y=*c-1

while (x<*r&&y>=0)//当数组的行小于3时并且列大于等于0时,执行循环,防止出现越界访问
{
	if (p[x][y] > n)
	{
		y--;

	}
	else if(p[x][y]<n)
	{
		x++;


	}
	else
	{
		*r = x;
		*c = y;
		return 1;
	}

}
return 2;

}
int main()
{
int arr[3][3] = { 1,2,3,4,5,6,7,8,9};//定义一个二维数组
int k = 0;
int x = 3;//行
int y = 3;//列
printf(“please input a number\n”);

scanf_s("%d", &k);//输入要查找的元素
int ret =find(arr, &x,&y,k);//创建一个变量接收函数传的值,
if (ret == 1)//ret==1说明找到了
{
	printf("%d %d\n", x, y);//输出找到的了的元素的下标
	printf("zhaodaole ");
}
else
{
	printf("meizhaodao ");//ret!=1时
}

return 0;

}

猜你喜欢

转载自blog.csdn.net/Kirihara_Yukiho/article/details/123230144