题目:
有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的请编写程序在这样的矩阵中套找某个数字是否存在。
要求:时间复杂度小于O(N);
目录
三、杨氏矩阵的代码实现
前言
杨氏矩阵。是对组合表示理论和舒伯特演算很有用的工具。它提供了一种方便的方式来描述对称和一般线性群的群表示,并研究它们的性质。杨氏矩阵是剑桥大学大学数学家阿尔弗雷德·扬在1900年提出。然后在1903年,它被用于格奥尔格·弗罗贝纽斯的对称群研究中。它的理论得益于许多数学家的贡献得到进一步发展,包括珀西·麦克马洪,W.V.D.霍奇,G.deB.罗宾逊,吉安·卡咯罗塔,阿兰拉斯克斯,马塞尔·保罗斯库森博格和理查德·P·史丹利。
一、杨氏矩阵是什么?
在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
注意:每一行从左到右递增,每一列从上往下递增。递增指的是逐渐增大,切不可片面理解为等差递增。
二、解决杨氏矩阵查找问题的思路
如下有一个杨氏矩阵,以7为例子,我们在矩阵中查找7。
先介绍我们第一看到此类问题的解决方法----遍历法
通过遍历数组中的每一个元素来查找到7。此方法简单暴力运算复杂,但我要注意题目所给条件:
"要求:时间复杂度小于O(N);"
有此限制条件我们就注定不能使用遍历法。
接下来说说解决此类问题的正确思路
通过观察发现最右边一列中的每个元素是该行中的最大数,最上边一行是该列中的最小数,我们可以通过此发现解决此类问题。
方法:
定位右上角的元素,将此元素与我们所查找的数进行比较,4比7小,4作为第一行中最大数,所以该行中所有元素都比7小,我们就可以将这一行直接排除
再次定位右上角元素,此时为8,与7比较,8>7,因为8此时为该列中最小的元素,所以该列中所有元素都比7大,因此该列中所有元素都可以被排除。
如此往复,直到我们找到该元素,此方法的好处在于每一次判断都可以排除一行或者一列,效率十分高。
三、杨氏矩阵的代码实现
#include<stdio.h>
void 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++;
}
if (a[x][y]>k)
{
y--;
}
if (a[x][y] == k)
{
printf("找到了\n");
printf("下标为%d %d\n", x, y);
break;
}
else
{
printf("没找到");
}
}
}
int main()
{
int a[3][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int k = 0;
scanf("%d", &k);
int x = 3;
int y = 3;
find(a, x, y,k);
return 0;
}
1.要进行右上角的定位
2.while循环中需要进行限制,行数要小于row,列数要大于等于0,防止越界
3.因为为传值调用,无法改变x,y的值,如需记录该点的坐标,可以通过传址调用带回坐标的值。