Nicn的刷题日常之杨氏矩阵(三种方法求解,逐级递增详解,手把手教学,建议三连收藏)

本文主要是介绍Nicn的刷题日常之杨氏矩阵(三种方法求解,逐级递增详解,手把手教学,建议三连收藏),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1.杨氏矩阵知识普及:什么是样式矩阵 

2.题目描述

3.解题 

3.1暴力求解,遍历法

3.2巧妙解题:对角元素法 

3.3将巧解法封装为函数 

4.结语 


1.杨氏矩阵知识普及:什么是样式矩阵 

      杨氏矩阵,是对组合表示理论和舒伯特演算很有用的工具。它提供了一种方便的方式来描述对称和一般线性群的群表示,并研究它们的性质。有一个二维数组. 数组的每行从左到右是递增的,每列从上到下是递增的. 在这样的数组中查找一个数字是否存在。 时间复杂度小于O(N);

而在C语言中,我们通常理解的矩阵就是二维数组,那么 

即是一个杨氏矩阵 。

2.题目描述

有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。

要求:时间复杂度小于O(N);

补充时间复杂度:假设数组有N个元素,遍历这个数组的每个元素去找数字最坏的情况就是将所有元素都遍历一遍,找N次,这时就称时间复杂度为O(n)

时间复杂度描述的是速率,描述最坏的数量积

3.解题 

3.1暴力求解,遍历法

这个办法实现的思想是通过遍历数组的每一个元素来找到某个符合要求的数字,如果1考虑最坏的情况,满足要求的数字刚好是最后一个,那就得把数组从第一个元素到最后一个元素都遍历一遍。这样时间复杂度为O(n),但不失为一种办法,我们来实现一下。

int main()
{int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };int input = 0;printf("请输入您要查找的数字:>");scanf("%d", &input);int i = 0;int j = 0;for (i = 0; i < 3; i++){for (j = 0; j < 3; j++){if (arr[i][j] == input){printf("找到了,下标是%d %d\n", i, j);return;}}}printf("很遗憾没有这个数");return 0;
}

 让我们来看一下运行效果:

那我们刚才也说了,遍历法虽然是可行的但是却达不到我们的时间复杂度要求,所以我们得改进方法,介绍我们的第二种方法对角元素法:

3.2巧妙解题:对角元素法 

对于杨氏矩阵来说,有四个位置的数字是特别的,就是四个对角上的元素:

既然如此我们就可以利用数字3和7这两个位置中的任意一个,例如我们就利用3来查找5:

首先将3和5作比较,由于3是第一行最大元素都小于5,那么第一行的元素就排除,我们行数+1,我们看第二行对应1第一行3的位置的数是6,与5比较大于5,那说明要查找的数5就在第二行当时所在位数的列数小于6所在的列数,所以我们行数确定,列数-1,就找到了5. 

我们来看一下实现过程:

int main()
{int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };int input = 0;printf("请输入您要查找的数字:>");scanf("%d", &input);int i = 0;int j = 2;int flag = 0;while (i<=2&&j>=0){if (arr[i][j] < input){i++;//行数增加,列数不变}else if (arr[i][j] > input){j--;//列数减去1}else{printf("找到了,下标是:%d %d\n", i,j);flag = 1;break;}}if (flag == 0)printf("很抱歉没有找到\n");return 0;
}

 

3.3将巧解法封装为函数 

当封装为一个查找函数的时候,我们就不应该在函数内部进行打印,而是应该在函数外部进行打印,那我们的函数就应该要返回横纵坐标,

这样写可以吗?

return  x,y;

明显这样的返回值是错误的,x,y会被当做为一个逗号表达式进行看待。

所以这里我是直接进行传地址,利用指针传参。我们看一下实现:

void Yang_table_serch(int arr[3][3], int k, int* r, int* c)
{int i = 0;int j = *c - 1;int flag = 0;while (i <= *c-1 && j >= 0){if (arr[i][j] < k){i++;//行数增加,列数不变}else if (arr[i][j] >k){j--;//列数减去1}else{*r = i;*c = j;flag = 1;return;}}if (flag == 0)*r = -1;*c = -1;return;}
int main()
{int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };int input = 0;printf("请输入您要查找的数字:>");scanf("%d", &input);int i = 0;int j = 2;Yang_table_serch(arr, input, &i, &j);if (i == -1 && j == -1){printf("没有找到\n");}else{printf("找到了,下标是:%d %d\n", i, j);}return 0;
}

 

4.结语 

以上就是本期的所有内容,知识含量蛮多,大家可以配合解释和原码运行理解。创作不易,大家如果觉得还可以的话,欢迎大家三连,有问题的地方欢迎大家指正,一起交流学习,一起成长,我是Nicn,正在c++方向前行的奋斗者,感谢大家的关注与喜欢。

      

这篇关于Nicn的刷题日常之杨氏矩阵(三种方法求解,逐级递增详解,手把手教学,建议三连收藏)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/677638

相关文章

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Git中恢复已删除分支的几种方法

《Git中恢复已删除分支的几种方法》:本文主要介绍在Git中恢复已删除分支的几种方法,包括查找提交记录、恢复分支、推送恢复的分支等步骤,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录1. 恢复本地删除的分支场景方法2. 恢复远程删除的分支场景方法3. 恢复未推送的本地删除分支场景方法4. 恢复

Java访问修饰符public、private、protected及默认访问权限详解

《Java访问修饰符public、private、protected及默认访问权限详解》:本文主要介绍Java访问修饰符public、private、protected及默认访问权限的相关资料,每... 目录前言1. public 访问修饰符特点:示例:适用场景:2. private 访问修饰符特点:示例:

Python将大量遥感数据的值缩放指定倍数的方法(推荐)

《Python将大量遥感数据的值缩放指定倍数的方法(推荐)》本文介绍基于Python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处理,并将所得处理后数据保存为新的遥感影像... 本文介绍基于python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处

python管理工具之conda安装部署及使用详解

《python管理工具之conda安装部署及使用详解》这篇文章详细介绍了如何安装和使用conda来管理Python环境,它涵盖了从安装部署、镜像源配置到具体的conda使用方法,包括创建、激活、安装包... 目录pytpshheraerUhon管理工具:conda部署+使用一、安装部署1、 下载2、 安装3

详解Java如何向http/https接口发出请求

《详解Java如何向http/https接口发出请求》这篇文章主要为大家详细介绍了Java如何实现向http/https接口发出请求,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用Java发送web请求所用到的包都在java.net下,在具体使用时可以用如下代码,你可以把它封装成一

Window Server2016加入AD域的方法步骤

《WindowServer2016加入AD域的方法步骤》:本文主要介绍WindowServer2016加入AD域的方法步骤,包括配置DNS、检测ping通、更改计算机域、输入账号密码、重启服务... 目录一、 准备条件二、配置ServerB加入ServerA的AD域(test.ly)三、查看加入AD域后的变

Window Server2016 AD域的创建的方法步骤

《WindowServer2016AD域的创建的方法步骤》本文主要介绍了WindowServer2016AD域的创建的方法步骤,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、准备条件二、在ServerA服务器中常见AD域管理器:三、创建AD域,域地址为“test.ly”

NFS实现多服务器文件的共享的方法步骤

《NFS实现多服务器文件的共享的方法步骤》NFS允许网络中的计算机之间共享资源,客户端可以透明地读写远端NFS服务器上的文件,本文就来介绍一下NFS实现多服务器文件的共享的方法步骤,感兴趣的可以了解一... 目录一、简介二、部署1、准备1、服务端和客户端:安装nfs-utils2、服务端:创建共享目录3、服