这个题,首先要直到杨氏矩阵是什么。
杨氏矩阵就是例如下面这样每一行每一列都是递增的矩阵。而在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;
}