杨氏矩阵笔试题讲解

杨氏矩阵笔试题

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

杨氏矩阵。 矩阵的每行从左到右是递增的,每列从上到下是递增的。是对组合表示理论和舒伯特演算很有用的工具。它提供了一种方便的方式来描述对称和一般线性群的群表示,并研究它们的性质。杨氏矩阵是剑桥大学大学数学家阿尔弗雷德·扬在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;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小赵小赵福星高照~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值