C语言:杨氏矩阵

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

数组:
1 2 3
2 3 4
3 4 5


1 3 4
2 4 5
4 5 6

分析:通过观察,我们发现右上角的数字比较特殊,它是所在行的最大数字,同时又是所在列的最小数字,所以我们就以右上角的数字和我们要找的数字相比较,如果要找的数字比右上角的数字大,我们可以直接跳到下一行,同理,如果要找的数字比右上角的数字小,可以去掉右上角数字所在的列。
具体代码如下:

#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
		{
			*px = x;
			*py = y;
			return 1;//找到了,返回1
		}
	}
	return 0;//没找到,返回0
}

int main()
{
	int arr[3][3] = { 1, 2, 3,2,3,4,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);//注意,这里不能写成&x,&y,因为在函数里面&y和&x经过了解引用
	}
	else
	{
		printf("找不到\n");
	}
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42270373/article/details/81198902