【C语言】代码实现杨氏矩阵中查找一个元素,时间复杂度小于O(N)

这个题,首先要直到杨氏矩阵是什么。

杨氏矩阵就是例如下面这样每一行每一列都是递增的矩阵。而在C语言中,我们可以把它定义为一个二维数组。只要把二维数组中每个值和目标值相比较,就能知道能不能找到这个元素。

1  2  3

4  5  6

7  8  9

然而题目还要求时间复杂度小于O(N),所以我们就不能一个一个的对比。

那我们可以发现,右上角和左下角的这两个数是最高效率的查找开始点。就用上边这个矩阵来举栗子吧~~

因为右上角的3是第一行里最大的元素,是第三列里最小的元素。而左下角的7又恰好是第三行最小的元素,是第一列最大的元素。我们为什么会选择这两个数来比较呢?是因为,假如我们选择3,那么将3与目标值进行比较,如果目标值大于3,就证明不在第一行,一下子砍掉了一行,如果小于3,就证明不在第三列,也能砍掉一列。这样子来循环比较是很高效的,最差也仅仅只需要查找5次即可知道结果。

用7来比较也是同样的道理。

然后就可以实现一个查找函数Find

在main函数里,调用自己定义的查找函数Find完成

写出代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>

int Find(int a[3][3], int row, int col,int k)
{
	int x = 0;
	int y = col - 1;
	while (x<row&&y>=0)
	{
		if (a[x][y] < k)
			x++;
		else if (a[x][y]>k)
			y--;
		else
			return 1;
	}
}

int main()
{
	int a[3][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	int k =7;
	int ret = Find(a,3,3,k);
	if (ret == 1)
		printf("找到了\n");
	else
		printf("找不到呀\n");

	system("pause");
	return 0;
}

猜你喜欢

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