杨氏矩阵:
有一个二维数组.数组的每行从左到右是递增的,每列从上到下是递增的.
在这样的数组中查找一个数字是否存在。如果存在返回坐标,不过不存在,返回不存在.时间复杂度小于O(N);
例如数组:
1 2 3
4 5 6
7 8 9
【解决思路】:简单的办法是将二维数组遍历一遍,依次比较,但是这样的话时间复杂度肯定大于o(n),不符合题目要求。我们要想做到时间复杂度小于o(n),只能根据杨氏矩阵的性质来查找,假设在上边的数组中我们要查找5,首先我们确定右上角的元素4,4<5,则现在我们可以去掉第一行,因为杨氏矩阵的每一行的元素是递增的;如果要找的数小于右上角的数,可以直接去掉一列,因为杨氏矩阵的每一列也是递增的。
以下为代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define ROW 3
#define COL 3
typedef struct Point //定义一个结构体返回坐标,并把类型名命为Point
{
int x;
int y;
}Point;
Point Find(int arr[ROW][COL], int f) //该函数返回值类型为Point
{
int x = 0;
int y = COL - 1;
Point ret = { -1, -1 };
while ((x <= ROW - 1) && (y >= 0))
{
if (f == arr[x][y])
{
ret.x = x;
ret.y = y;
return ret;
}
else if (f < arr[x][y])
{
--y;
}
else
{
++x;
}
}
return ret;
}
int main()
{
int f = 0;
int a[ROW][COL] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
printf("请输入要找的数:");
scanf("%d", &f);
Point ret = Find(a, f);
if ((ret.x != -1) && (ret.y != -1))
{
printf("找到了,下标为(%d,%d)\n", ret.x, ret.y);
}
else
{
printf("没找到!\n");
}
system("pause");
return 0;
}