【C语言练习】杨氏矩阵、杨辉三角

news2024/12/23 11:08:00

在这里插入图片描述
在这里插入图片描述

目录

  • 一:杨氏矩阵
    • 🐻何为杨氏矩阵?
    • 🐻题目描述:
    • 🐻思路一:
    • 🐻思路二:
  • 二:杨辉三角
    • 🐻何为杨辉三角?
    • 🐻题目描述:
    • 🐻解题思路:

一:杨氏矩阵

🐻何为杨氏矩阵?

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

在这里插入图片描述
 如上图就是一个杨氏矩阵。

🐻题目描述:

编写程序在杨氏矩阵中查找某一数字是否存在若存在打印出坐标,若不存在,打印 “没找到”要求:时间复杂度小于O(N)


🐻思路一:

 关于杨氏矩阵我们很容易想到可以用一个二维数组来表示,现在问题就变成了在一个二维数组中查找一个数字,我们很容易想到的就是遍历整个二维数组,这种方法当然没问题,但是但是它的时间复杂度是O(N^2),不满足题目要求,因此需要换一种思路。

🐻思路二:

 我们可以从杨氏矩阵的特点入手,来寻求解题方法。杨氏矩阵最显著的特点是: 矩阵的每一行从左到右递增的,矩阵的每一列从上到下递增的。因此我们不难发现:矩阵右上角的元素是第一行所有元素中最大的,同时也是最后一列所有元素中最小的。发现了这个特点以后,我们就可以让待查找的数字,与矩阵右上角的数字进行比较,如果待查找的数字比矩阵右上角的数字大,那待查找的数字就不可能在第一行,因为矩阵右上角的数字已经是第一行中最大的那个了,待查找的数字比矩阵右上角的数字还要大,此时就可以排除掉第一行的所有元素,在剩下的矩阵中查找。当待查找的数字比矩阵右上角的数字小的时候,那待查找的数字就不可能在矩阵的最后一列,因为矩阵右上角的数字已经是最后一列中最小的那个,待查找的数字比矩阵右上角的数字还要小,此时就可以排除掉矩阵最后一列的所有元素,在剩下的矩阵中查找。就一直这样让待查找的数字与矩阵右上角的数字作比较,最终就能比较出结果。分析的差不多了,接下来上代码。

void find_k(int arr[3][3], int r, int l, int k)
{
	//右上角元素的坐标(x,y)
	int x = 0;
	int y = l - 1;
	//定义一个标志变量flag
	int flag = 0;
	//找到时把flag置为1
	//最终通过看flag的值来看是否找到
	while (x < r && y >= 0)
	{
		if (arr[x][y] > k)//待查找的元素比右上角的元素小
			//此时就可以排除掉最右边的一整列
		{
			y--;
		}
		else if (arr[x][y] < k)//待查找的元素比右上角的元素大
			//此时就可以排除掉第一行所有元素
		{
			x++;
		}
		else//找到了
		{
			flag = 1;
			printf("找到了,坐标是:%d %d\n", x, y);
			break;//找到之后就要跳出循环
		}
	}
	if (flag == 0)
	{
		printf("没找到");
	}
}

int main()
{
	int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
	int r = sizeof(arr)/sizeof(arr[0]);//r表示行
	int l = sizeof(arr[0])/4;//l表示列
	int k = 0;//k表示待查找的数字
	printf("请输入要查找的数字:");
	scanf("%d", &k);
	find_k(arr, r, l, k);
	return 0;
}

 上面的代码已经满足题目要求,但是我们发现,查找结果是直接在find_k函数中打印出来的,如果我们想在主函数中打印查找结果该怎么办呢?判断找没找到很容易实现,如果找到了,就让find_k函数返回 1 1 1 ,如果没有找到,就让find_k函数返回 0 0 0 ,在主函数中用一个变量 ret 来接收函数的返回值,最终判断 ret 的大小就知道找没找到了。问题的难点在于:如果找到了,如何把坐标返回到主函数中,坐标是由两个数字组成的,因此无法直接利用 return 返回,还有什么办法呢?我们可以通过传地址来解决这个问题,观察find_k函数的参数,可以发现 rl 很适合来做这个差事,把rl 的地址传过去,如果找到了就把坐标存到rl里面去。分析的差不多了,接下来上代码:

int find_k(int arr[3][3], int* pr, int* pl, int k)
{
	//右上角元素的坐标(x,y)
	int x = 0;
	int y = *pl - 1;
	while (x < *pr && y >= 0)
	{
		if (arr[x][y] > k)//待查找的元素比右上角的元素小
			//此时就可以排除掉最右边的一整列
		{
			y--;
		}
		else if (arr[x][y] < k)//待查找的元素比右上角的元素大
			//此时就可以排除掉第一行所有元素
		{
			x++;
		}
		else//找到了
		{
			*pr = x;
			*pl = y;
			return 1;//找到之后就返回1
		}
	}
	return 0;
}

int main()
{
	int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
	int r = sizeof(arr) / sizeof(arr[0]);//r表示行数
	int l = sizeof(arr[0]) / 4;//l表示列数
	int k = 0;//k表示待查找的数字
	printf("请输入要查找的数字:");
	scanf("%d", &k);
	int ret = find_k(arr, &r, &l, k);
	if (ret == 0)
	{
		printf("没找到\n");
	}
	else
	{
		printf("找到了,坐标是:%d %d\n", r, l);
	}
	return 0;
}

 本题到这里就结束了。请看下一题,剧透以下:下个题也性

二:杨辉三角

🐻何为杨辉三角?

杨辉三角,是二项式系数在三角形中的一种几何排列。在欧洲,这个表叫做帕斯卡三角形。帕斯卡(1623----1662)是在1654年发现这一规律的,比杨辉要迟393年,比贾宪迟600年。杨辉三角是中国古代数学的杰出研究成果之一,它把二项式系数图形化,把组合数内在的一些代数性质直观地从图形中体现出来,是一种离散型的数与形的结合

在这里插入图片描述
上图就是一个杨辉三角

🐻题目描述:

在屏幕上打印出杨辉三角


🐻解题思路:

 首先应想到的是,利用二维数组来存储杨辉三角每一行的数值。接下来就该观察这些数值的特点了,不难发现二维数组的 0 0 0主对角线上的元素全是 1 1 1,对于这些位置上的元素我们可以直接把其初始化为 1 1 1 ,剩下位置上的元素是需要通过计算得到的,假设当前位置的下标是 i ,j那么arr[i][j]的值就是其正上方和左上方的值的和,也就是公式:arr[i][j]=arr[i-1][j-1]+arr[i-1][j] 。其实从二维数组的第二行开始,主对角线上的元素也可以通过前面的公式计算得出,但此时必须保证公式中 arr[i-1][j] 的值是 0 0 0 ,如果当前的 arr[i][j] 是主对角线上的元素,那么 arr[i-1][j] 就不是杨辉三角中的一份子,但是为了计算出arr[i][j],我们必须保证arr[i-1][j]的值是 0 0 0 ,这一点也很容易实现,在定义二维数组的同时,我们只初始化数组的第一个元素,把它初始化为 1 1 1 ,此时数组中剩下的元素就会被默认初始化为 0 0 0 ,这样问题就得以解决了。二维数组中的数值处理完了,接下来就该把这个二维数组打印出来了,杨辉三角只占用了二维数组的左下角这一片区域,所以只需要打印出左下角这片区域的内容即可,这片区域的坐标特点是:列标小于等于行标。分析的差不多了,接下来上代码:

int main()
{
	int arr[10][10] = {1};//直接把第一个元素初始化成1,也就是杨辉三角的第一行
	int i = 0;
	for (i = 1; i < 10; i++)//接下来从第二行开始
	{
		arr[i][0] = 1;//每行的第一列都没有区别,直接给1,保证不会越界
		int j = 0;
		for (j = 1; j <= i; j++)//从第二列开始
		{
			arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
		}
	}
	//打印
	for (i = 0; i < 10; i++)
	{
		int j = 0;
		for (j = 0; j <=i; j++)
		{
			//只需要打印左下区的元素
			//左下区元素小标的特点是:列标小于等于行标
			printf("%d ", arr[i][j]);
		}
		//一行打印结束换行
		printf("\n");
	}
	return 0;
}

🎶结语:
 今天分享了两道性题目,杨氏矩阵杨辉三角,这两道题都是已二维数组为基础,再结合各自的特点最终完成题解,由此可见拿到题目最主要的就是发现题目的特点,结合特点去解题往往会达到事半功倍的效果。
 今天的分享到这里就结束啦,以上的内容如果对你有帮助的话,可以动动小手点赞、评论、收藏,你的支持就是我前进路上最大的动力!


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/193211.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python数据结构(四):dict(字典)

一、定义字典 1、使用花括号&#xff0c;可以直接定义字典 使用一对大括号{}&#xff0c;数据是成对存在的&#xff0c;每一行冒号左边的是键&#xff08;key&#xff09;,右边的是值&#xff08;value&#xff09;&#xff0c;称作键值对&#xff0c;以逗号分隔开。键是不能重…

Fennec:针对类Unix操作系统的多功能事件应急响应工具箱

关于Fennec Fennec是一个针对类Unix操作系统的多功能事件应急响应工具箱&#xff0c;Fennec基于Rust开发&#xff0c;可以帮助广大研究人员在类Unix操作系统上实现网络安全事件应急响应。除此之外&#xff0c;Fennec还支持广大研究人员自行开发相关的配置文件&#xff0c;并增…

第一章.感知机

第一章.感知机 1.感知机的简介 1).简介 感知机接收多个输入信号&#xff0c;输出一个信号。感知机的信号只有"流/不流"&#xff08;1/0&#xff09;两种取值[0:对应不传递信号&#xff0c;1:对应传递信号] 2).感知机图像描述的两种方式 ①.第一种方式&#xff1a; …

css3 transform(变形) 实战示例

1--利用transform实现居中效果 <div class"center">.... </div> .center{text-align: center;background-color: #fff;border-radius: 20px;width: 300px;height: 350px;position: absolute;left: 50%;top: 50%;transform: translate(-50%,-50%); } 让…

第一章 隐私计算科普解读

前言 提醒&#xff1a;全文10千字&#xff0c;预计阅读时长15分钟&#xff1b;读者&#xff1a;对隐私计算感兴趣的小伙伴&#xff1b;目的&#xff1a;读者利用15~30 分钟对本文沉浸式阅读理解&#xff0c;能够掌握隐私计算 80% 的概念&#xff1b;关键词 &#xff1a;隐私计算…

全网最细------爬取4k付费高清大图(免费下载再也不是梦)

本次案例将教大家免费爬取4k高清付费大图&#xff0c;即使你是爬虫新手&#xff0c;也可以食用本次文章实现你的免费下载梦,话不多说&#xff0c;先看效果 网站视图: 看到这些图片你是否怦然心动&#xff0c;跟着我一起看下去. 下图是图片下载后保存的目录 一.思路分析 首…

QEMU安装Windows 10的完整过程

零、环境介绍 宿主机&#xff1a; Ubuntu 22.04.1 LTS Windows 10镜像&#xff1a; Windows10_20H2.iso QEMU版本&#xff1a; qemu-img version 7.1.0 Copyright (c) 2003-2022 Fabrice Bellard and the QEMU Project developers 一、安装过程 1. 创建镜像文件 使用qe…

7、标识重复个案

目录 一、导入或打开数据 二、选择“数据”菜单下的“标识重复个案”&#xff0c;弹出相应对话框 三、在上个步骤的基础上&#xff0c;将左边的所有变量都移至右边“定义匹配个案的依据”中&#xff0c;其他的选项没有特殊要求的可保持默认&#xff0c;单击“确定”即完成。…

Cookie 和 Session 详解 及实现用户登陆功能

Cookie是啥? 浏览器提供的在客户端存储数据的一种机制。(由于浏览器禁止了网页中的代码直接访问磁盘的文件因此要想再网页中实现数据的持久化存储、就可以使用Cookie这样的机制 Cookie 里面存什么? 键值对结构.键和值都是程序猿自定义的~Cookie从哪里来? 服务器返回响应…

【Java|golang】2325. 解密消息

给你字符串 key 和 message &#xff0c;分别表示一个加密密钥和一段加密消息。解密 message 的步骤如下&#xff1a; 使用 key 中 26 个英文小写字母第一次出现的顺序作为替换表中的字母 顺序 。 将替换表与普通英文字母表对齐&#xff0c;形成对照表。 按照对照表 替换 mess…

【23 Java后端】小米

一、JavaSE JaveEE —— Java 数据结构 —— 集合类 1. HashMap 底层&#xff0c;链表与红黑树转换原因 JDK 1.7 HashMap 底层使用 “数组链表” 实现&#xff0c;数组为主体&#xff0c;链表为了解决 哈希冲突JDK 1.8 HashMap 底层使用 “数组链表红黑树” 实现 当链表长度…

bootstrap是什么,bootstrap如何使用

bootstrap是什么 Bootstrap 是最受欢迎的 HTML、CSS 和 JS 框架&#xff0c;用于开发响应式布局、移动设备优先的 WEB 项目。 使用bootstrap 下载地址

Power BI散点图

散点图可以让一大堆令人困惑的散乱数据变得通俗易懂&#xff0c;并能让你从这些庞杂数据中发现一些表面上看不到的关系&#xff0c;数据量越大&#xff0c;从散点图的分布中越能看出来一些规律。 什么是散点图 在直角坐标系中&#xff0c;用两组数据构成多个坐标点&#xff0…

【无标题】质量管理10题

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

使用 WSL2 进行 Go 开发

文章目录1. 安装 WSL22. 配置 Ubuntu 环境配置 root 用户密码设置默认 root3. 配置 Go 环境下载 SDK配置环境变量配置 GOPROXY4. 使用 GoLand 进行开发由于 kitex 目前对 Windows 下自动生成代码适配不完善&#xff0c;因此使用 WSL2 进行 Go 的开发&#xff0c;在配置 WSL2 环…

IEEE参考文献格式生成 之 谢谢你Zotero!

谢谢你Zotero&#xff01;心酸的开始方法1&#xff08;有文献pdf&#xff09;方法2&#xff08;无文献pdf&#xff09;方法3&#xff08;自己写&#xff09;怎么找到bib文件呢&#xff1f;期刊论文会议论文书籍&#xff08;专著&#xff09;心酸的开始 一开始在看到论文模板的…

20230202英语学习

How James Webb Space Telescope Changed Astronomy in Its First Year 你最爱的这些绝美图像&#xff0c;正在改变宇宙学 The most pressing aim of JWST is one of the most ambitious projects in the recent history of astronomy: to look back at some of the first ga…

力扣刷题记录——1078. Bigram 分词、1207. 独一无二的出现次数 、1089. 复写零

本专栏主要记录力扣的刷题记录&#xff0c;备战蓝桥杯&#xff0c;供复盘和优化算法使用&#xff0c;也希望给大家带来帮助&#xff0c;博主是算法小白&#xff0c;希望各位大佬不要见笑&#xff0c;今天要分享的是——《力扣刷题记录——1078. Bigram 分词、1207. 独一无二的出…

python面向对象:三大特性

python面向对象三大特性&#xff1a;继承、封装、多态 文章目录python面向对象三大特性&#xff1a;继承、封装、多态一、实验目的二、实验原理三、实验环境四、实验内容五、实验步骤1.封装2.继承3.多态总结一、实验目的 掌握类的封装、多态、继承 二、实验原理 面向对象的三…

Python爬虫3-数据解析方法:正则表达式介绍及案例

目录标题1、正则表达式介绍re库的主要功能函数Re库的match对象Re库的贪婪匹配和最小匹配2、正则表达式案例案例1&#xff1a;所有图片爬取案例2&#xff1a;分页爬取案例3&#xff1a;淘宝商品信息案例4&#xff1a;股票数据1、正则表达式介绍 正则表达式re:简洁表达一组字符串…