杨氏矩阵笔试题讲解
Posted 小赵小赵福星高照~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了杨氏矩阵笔试题讲解相关的知识,希望对你有一定的参考价值。
杨氏矩阵笔试题
我们首先了解一下杨氏矩阵:
杨氏矩阵。 矩阵的每行从左到右是递增的,每列从上到下是递增的。是对组合表示理论和舒伯特演算很有用的工具。它提供了一种方便的方式来描述对称和一般线性群的群表示,并研究它们的性质。杨氏矩阵是剑桥大学大学数学家阿尔弗雷德·扬在1900年提出。然后在1903年,它被用于格奥尔格·弗罗贝纽斯的对称群研究中。它的理论得益于许多数学家的贡献得到进一步发展,包括珀西·麦克马洪,W.V.D.霍奇,G.deB.罗宾逊,吉安·卡咯罗塔,阿兰拉斯克斯,马塞尔·保罗斯库森博格和理查德·P·史丹利。
题目描述:
有一个二维数组. 数组的每行从左到右是递增的,每列从上到下是递增的. 在这样的数组中查找一个数字是否存在。 时间复杂度小于O(N)。
解题思路:
我们从右上角开始查找,右上角数字有左边数字和下边数字,左边数字小于它,下边数字大于它,当查找值小于当前值时,我们列减减,到达它左边的数字,当查找值大于当前值时,我们行减减,到达它下边的数字。
代码如下:
#define ROW 3
#define COL 3
int FindValue(int a[][3], int i, int j, int *x, int *y, int value)
{
if (value<a[0][0] || value>a[i - 1][j - 1])//判断是不是比最小的还小或者比最大的还大
return 0;
int row = 0;
int col = j-1;
while (row < j && col>=0)
{
if (value < a[row][col])//从右上角开始查找,小于左移
{
col--;
}
else if (value > a[row][col])//大于下移
{
row++;
}
else
{
*x = row;
*y = col;
return 1;
}
}
return 0;
}
int main()
{
int arr[][3] = { {1,3,5},{2,4,6},{7,8,9} };
int x = 0;
int y = 0;
if (FindValue(arr,ROW,COL,&x,&y,9))
{
printf("找到了,下标为:%d %d\\n",x,y);
}
else
{
printf("没找到\\n");
}
return 0;
}
以上是关于杨氏矩阵笔试题讲解的主要内容,如果未能解决你的问题,请参考以下文章