杨氏矩阵笔试题讲解

Posted 小赵小赵福星高照~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了杨氏矩阵笔试题讲解相关的知识,希望对你有一定的参考价值。

杨氏矩阵笔试题

我们首先了解一下杨氏矩阵:

杨氏矩阵。 矩阵的每行从左到右是递增的,每列从上到下是递增的。是对组合表示理论和舒伯特演算很有用的工具。它提供了一种方便的方式来描述对称和一般线性群的群表示,并研究它们的性质。杨氏矩阵是剑桥大学大学数学家阿尔弗雷德·扬在1900年提出。然后在1903年,它被用于格奥尔格·弗罗贝纽斯的对称群研究中。它的理论得益于许多数学家的贡献得到进一步发展,包括珀西·麦克马洪,W.V.D.霍奇,G.deB.罗宾逊,吉安·卡咯罗塔,阿兰拉斯克斯,马塞尔·保罗斯库森博格和理查德·P·史丹利。

题目描述:

有一个二维数组. 数组的每行从左到右是递增的,每列从上到下是递增的. 在这样的数组中查找一个数字是否存在。 时间复杂度小于O(N)。

解题思路:

我们从右上角开始查找,右上角数字有左边数字和下边数字,左边数字小于它,下边数字大于它,当查找值小于当前值时,我们列减减,到达它左边的数字,当查找值大于当前值时,我们行减减,到达它下边的数字。

image-20210528102634638

代码如下:

#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;
}

以上是关于杨氏矩阵笔试题讲解的主要内容,如果未能解决你的问题,请参考以下文章

nice公司的一道笔试题讲解

杨氏矩阵的简单介绍与查找算法

C++笔试试题讲解(~~~可能是全站唯独一份有解析的~~~)

矩阵乘法计算量估算, 华为笔试题

C语言进阶之旅 (每日一题)杨氏矩阵

华为笔试题--蛇形矩阵