C语言题目——杨氏矩阵

杨氏矩阵

什么是杨氏矩阵

杨氏矩阵(Young tableau),又名杨表,是一种常用于表示论和舒伯特演算中的组合对象。
杨表是一种特殊的矩阵。它便于对称群和一般线性群的群表示和性质研究。杨表由剑桥大学数学家阿尔弗雷德·杨(Alfred Young)于 1900 年首次提出,于 1903 年被德国数学家弗罗贝尼乌斯(Ferdinand Georg Frobenius)应用于对称群的研究。

题目描述

我们在这里只对杨氏矩阵做简单的应用。
有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。
要求:时间复杂度小于O(N);

解题思路

我们先看几个简单的杨氏矩阵
在这里插入图片描述

在这里插入图片描述
通过我们仔细分析杨氏矩阵不难发现,杨氏矩阵的右上角和左下角的元素是有特点的,右上角的元素是一行中最大的,一列中最小的,左下角的元素是一行中最小的,一列中最大的。因此,如果我们需要在矩阵中查找某个元素,我们可以从这两个角入手。

例如我们从右上角开始查询

我们以第一个杨氏矩阵为例,假如我们要查询7,查询的规则就是,如果右上角的元素比要查询的元素小,我们就排除它所在的那一行,如果右上角的元素比要查询的元素大,我们就排除它所在的那一列。然后依然用右上角的元素和要查询的元素进行比较,直到找到或者找不到那个元素。
在这里插入图片描述
代码1如下:

#include <stdio.h>
int Find(int arr[][3], int r, int c, int k)
{
	int x = 0;
	int y = c - 1;
	//这里是利用右上角的元素来查找
	while (x < r && y >= 0)
	{
		if (arr[x][y] < k)
		{
			//这里排除一行
			x++;
		}
		else if (arr[x][y] > k)
		{
			//这里排除一列
			y--;
	 	}
		else
		{
			return 1;
		}
	}
	return 0;
}

int main()
{
	int arr[3][3] = { 1, 2, 3, 3, 4, 5, 6, 7, 9 };
	int k = 7;
	int ret = Find(arr, 3, 3, k);
	if (ret == 1)
	{
		printf("找到了\n");
	}
	else
	{
		printf("找不到\n");
	}

	return 0;
}

运行结果如下:
在这里插入图片描述

  • 值得注意的是,这个代码虽然满足了要求,但是它并不能够将找到的元素的位置打印出来,因此这个代码还需要改进。
    代码1改进:
#include <stdio.h>
int Find(int arr[][3], int* px, int* py, int k)
{
	int x = 0;
	int y = *py - 1;
	while (x < *px && y >= 0)
	{
		if (arr[x][y] < k)
		{
			x++;
		}
		else if (arr[x][y] > k)
		{
			y--;
		}
		else
		{
			//如果找到了,那就将main函数里的x和y进行修改
			*px = x;
			*py = y;
			return 1;
		}

	}
	return 0;
}
int main()
{
	int arr[3][3] = { 1, 2, 3, 3, 4, 5, 6, 7, 9 };
	int x = 3;//行数
	int y = 3;//列数
	int k = 7;//待查元素
	//这里把行数和列数以地址的形式传给函数
	int ret = Find(arr, &x, &y, k);
	if (ret == 1)
	{
		printf("找到了\n");
		printf("%d %d", x, y);
	}
	else
	{
		printf("找不到\n");
	}
	return 0;
}

运行结果如下:
在这里插入图片描述

  • 这样的话,我们就完成了这个题目
    感谢阅读,欢迎指正
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

贝壳cc

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

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

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

打赏作者

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

抵扣说明:

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

余额充值