使用C语言实现杨氏矩阵并找出数字

embedded/2024/9/25 10:36:26/

        前言

        过了五一假期,咋们经过了一个假期的休息,要继续学习了,不能偷懒哦!!

        今天让我们来看看如何在一个杨氏矩阵中找出自己想找到的数字。

        首先,我们要了解一下杨氏矩阵到底是什么,如果一个矩阵中的每行元素从左到右,从上到下都是递增的,并且它的行和列的长度也是递增的,那么我们可以称这个矩阵为杨氏矩阵。

        来让我们看看今天的题目

        题目描述

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

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

        输入描述:

        无

        输出描述:

        一行,

        题目解析

        我们之前已经了解了杨氏矩阵的概念,在这道题中,其实就是让我们在杨氏矩阵中找到一个数字,但是还有一个要求,是时间复杂度小于O(N),这是什么意思呢?

        时间复杂度解释

        我们把这个杨氏矩阵看作一个二维数组,如果这个数组中有n个元素,你去遍历数组,去找你想要找的那个元素的话,最坏的情况是找n次,如果我们去遍历,我们就叫它的时间复杂度为O(N),时间复杂度讨论的是这个算法最坏的情况下的一个数量级。

        不知道这样说大家能不能理解,这个时间复杂度小于O(N)其实就是告诉我们,不能通过遍历这个数组的方式去找到我们想要找的数字,遍历这个数组的时候时间复杂度是等于O(N)的,我们要去观察杨氏矩阵的规律,使用自己的方式解决问题。

        杨氏矩阵图解

        我们就画一个简单的杨氏矩阵来观察一下它的特点吧

        

        我们发现,在这个杨氏矩阵中,根据杨氏矩阵的特点来看,它又上角的数字是一行里面最大的,又是一列里面最小的,我们可以使用这个特征去写代码。

        基本逻辑

        当我们要去找7这个数字的时候,我们拿3与他比较,发现7比3大,那么3已经是第一行里最大的元素了,我们就可以将第一行排除出去,在其他的元素中找我们要找的数字

        当我们要去找2这个数字的时候,我们还是拿3与他比较,我们发现2比3小,那么这个时候3已经是他自己那一列最小的元素了,这一列就不可能有我们要找的元素,所以可以将有3的这一列给排除,在其他的元素中找我们要找的数字。

        基本逻辑我们清楚了,上代码

        代码展示

        

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void find_k(int arr[3][3], int r, int c, int k)
{int x = 0;int y = c - 1;int flag = 0;//假设找不到元素//当行x下标小于等于2的时候,列元素下标大于等于0的时候进入循环,防止越界while (x<=r-1&&y>=0){//使用右上角元素与k进行比较,如果右上角元素比k小那么行x+1,在下一行里寻找if (arr[x][y] < k){x++;}//右上角元素比k大列减1,排除列else if (arr[x][y] > k){y--;}else{printf("找到了,下标是:%d %d", x, y);flag = 1;break;}}if (flag == 0){printf("找不到\n");}
}
int main()
{int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };int k = 7;find_k(arr, 3, 3,k);
}

        代码解析

        我们首先创建二阶矩阵arr,我们按照杨氏矩阵的方式将数组中元素排列完成,假设我们要找的是数字7,创建变量k来接收。

        我们通过函数的方式来寻找k,定义函数find_k,我们将数字arr和行列与要找的元素k作为函数的参数。

        在寻找数字的时候,根据题目要求我们只需要找到矩阵中有这个数字即可,所以我们找到下标,之后打印出来就好,中间我们设置变量flag,假设当flag=0的时候我们找不到这个元素,flag=1我们就找到元素k。

        今天就到这里喽,希望大家可以了解到杨氏矩阵的一些知识并且有所收获,加油!!


http://www.ppmy.cn/embedded/35160.html

相关文章

【动态规划】数组中数字和为sum的方案个数

【动态规划】数组中数字和为sum的方案个数 给定一个有 n n n个正整数的数组 a 和一个正整数 s u m sum sum&#xff0c;求选择数组 a 中 部分数字和为 s u m sum sum的方案数。若两种选取方案有一个数字的下标不一样&#xff0c;则认为是不同的方案。 输入描述&#xff1a;…

Linux网络-部署YUM仓库及NFS共享服务

目录 一.YUM仓库服务 1.YUM概述 1.1.YUM&#xff08;Yellow dog Updater Modified&#xff09; 2.准备安装源 2.1.软件仓库的提供方式 2.2.RPM软件包的来源 2.3.构建CentOS 7 软件仓库 2.4.在软件仓库中加入非官方RPM包组 3.一键安装软件包的工具&#xff1a; 好处&a…

知到java笔记(4.1--继承的用法以及this和super的用法)

格式&#xff1a; 例子&#xff1a; get set获取父类的私有变量 private属性 this和super区别&#xff1a; this用法 super用法 例子

[安全开发]如何搭建一款自己的网安微信机器人

前言 hxd写的一个微信网安机器人。 原理 基于HOOK的微信机器人&#xff0c;以往的机器人大多数为协议机器人&#xff0c;封号概率极大&#xff08;下面会详细讲解hook和协议的区别&#xff09;&#xff0c;而HOOK机制的大大减小了封号几率。 什么是协议机器人&#xff1f; …

文本转图表的AI工具-Chart-GPT

Chart-GPT Chart-GPT一款基于 GPT 实现的开源工具&#xff0c;可在几秒内&#xff0c;将文本快速转换为各种图表。用户只需在输入字段中输入数据说明和所需的图表类型&#xff0c;Chart-GPT的后台生成器即可建出多种类型的图表&#xff0c;包括条形图、折线图、组合图、散点图、…

大数据技术概述_4.大数据的应用领域

1.制造业的应用 制造业目前正在向信息化和自动化的方向发展。在产品的设计、生产和销售中&#xff0c;越来越多的企业使用计算机辅助设计&#xff08;CAD&#xff09;、计算机辅助制造&#xff08;CAM&#xff09;等软件&#xff0c;数控机床、传感器等设备&#xff0c;物料需求…

免费分享一套微信小程序商城系统(电商系统)(SpringBoot+Vue3)【至尊版】,帅呆了~~

大家好&#xff0c;我是java1234_小锋老师&#xff0c;自己原创写了一个不错的微信小程序商城系统(电商系统)(SpringBootVue3)【至尊版】&#xff0c;免费分享下哈。 项目视频演示 【免费】微信小程序商城系统(电商系统)(SpringBootVue3) 【至尊版】Java毕业设计_哔哩哔哩_bi…

猜数字游戏

OK了诸君&#xff0c;五一小长假正式结束了&#xff0c;各位玩的怎么样呢&#xff1f;不管再怎么放肆开心&#xff0c;现在咱们也得把这个心往回拉一拉&#xff0c;学习方面咱们扬帆再起航&#xff0c;假期方面静静期待暑假哈哈哈 言归正传昂&#xff0c;这一期咱们主要是利用…