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

news2024/12/23 22:58:45

        前言

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

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

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

        来让我们看看今天的题目

        题目描述

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

        要求:时间复杂度小于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.coloradmin.cn/o/1646265.html

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

相关文章

[redis] redis为什么快

1. Redis与Memcached的区别 两者都是非关系型内存键值数据库&#xff0c;现在公司一般都是用 Redis 来实现缓存&#xff0c;而且 Redis 自身也越来越强大了&#xff01;Redis 与 Memcached 主要有以下不同&#xff1a; (1) memcached所有的值均是简单的字符串&#xff0c;red…

ACPWorkbench_for_BP10

一、菜单 文件菜单包含导入导出所有参数&#xff0c;导出flashbin文件和退出操作。文件菜单显示如下&#xff1a; Import Audio Settings&#xff1a;从音频配置文件中导入音频参数。 Export Audio Settings&#xff1a;将音频设置导出为音频配置文件。 Export Flash Binary Fi…

OpenNJet:下一代云原生应用引擎

OpenNJet&#xff1a;下一代云原生应用引擎 前言一、技术架构二、新增特性1. 透明流量劫持2. 熔断机制3. 遥测与故障注入 三、Ubuntu 发行版安装 OpentNJet1. 添加gpg 文件2. 添加APT 源3. 安装及启动4. 验证 总结 前言 OpenNJet&#xff0c;是一款基于强大的 NGINX 技术栈构建…

设置定位坐标+请按任意键继续

设置定位坐标 目的 在编程和游戏开发中&#xff0c;设置定位坐标的目的是为了确定对象在屏幕或游戏世界中的具体位置。坐标通常由一对数值表示&#xff0c;例如 (x, y)&#xff0c;其中 x 表示水平位置&#xff0c;y 表示垂直位置。设置定位坐标的目的包括&#xff1a; 1. **精…

【JavaScript】数据类型转换

JavaScript 中的数据类型转换主要包括两种&#xff1a;隐式类型转换&#xff08;Implicit Type Conversion&#xff09;和显式类型转换&#xff08;Explicit Type Conversion&#xff09;。 1. 隐式类型转换&#xff08;自动转换&#xff09;&#xff1a; js 是动态语言&…

CNN笔记详解

CNN(卷积神经网络) 计算机视觉&#xff0c;当你们听到这一概念的是否好奇计算机到底是怎样知道这个图片是什么的呢&#xff1f;为此提出了卷积神经网络&#xff0c;通过卷积神经网络&#xff0c;计算机就可以识别出图片中的特征&#xff0c;从而识别出图片中的物体。看到这里充…

XYCTF2024 RE ez unity 复现

dll依然有加壳 但是这次global-metadata.dat也加密了&#xff0c;原工具没办法用了&#xff0c;不过依然是可以修复的 a. 法一&#xff1a;frida-il2cpp-bridge 可以用frida-il2cpp-bridge GitHub - vfsfitvnm/frida-il2cpp-bridge: A Frida module to dump, trace or hijac…

深度剖析muduo网络库1.1---面试提问(阻塞、非阻塞、同步、异步)

在面试过程中&#xff0c;如果被问到关于IO的阻塞、非阻塞、同步、异步时&#xff0c;我们应该如何回答呢&#xff1f; 结合最近学习的课程&#xff0c;我作出了以下的总结&#xff0c;希望能与大家共同探讨&#xff01; 先给出 陈硕大神原话&#xff1a;在处理IO的时候&…

存储故障后oracle报—ORA-01122/ORA-01207故障处理---惜分飞

客户存储异常,通过硬件恢复解决存储故障之后,oracle数据库无法正常启动(存储cache丢失),尝试recover数据库报ORA-00283 ORA-01122 ORA-01110 ORA-01207错误 以前处理过比较类似的存储故障case:又一起存储故障导致ORA-00333 ORA-00312恢复存储故障,强制拉库报ORA-600 kcbzib_kcr…

计算机毕设

随着社会和国家的重视&#xff0c;大学对于大学生毕业设计越来越重视。 做软件设计设计方面&#xff0c;前后端分离是必不可少的&#xff0c;代码管理工具&#xff0c;前后端接口测试是项目中必须要用到的工具。做大数据设计方面&#xff0c;主要是要用到爬虫进行数据爬取&…

(二)JSP教程——taglib指令

创建标签文件 首先创建一个Web项目&#xff0c;在webapp/WEB-INF目录下创建一个tags文件夹 在tags文件夹中创建一个oddNumberSum.tag文件&#xff0c;Tag文件时扩展名为.tag的文本文件&#xff0c;其结构和JSP文件非常相似&#xff0c;该文件的目录结构如图所示 创建Tag文件的…

Altium Designer——检查原理图库正确性并生成报告

一、方法&#xff1a; 1.打开原理图库&#xff1a; 2.点击菜单栏的报告选项&#xff1a; 3.选择器件规则检查&#xff1a; 根据需求勾选&#xff0c;一般都是全部勾选&#xff1a; 二、问题&#xff1a; 1.缺少封装会导致什么问题&#xff1a; 1.首先&#xff1a; 封装是…

方法的入栈和出栈

一.作用域问题 1.全局作用域 在全局都能进行访问的变量 var a 10;function fn() {var b 20;return a b;}console.log(fn()); 2.局部的作用域 只能在限定的范围内进行访问 function fn() {var b 20;}console.log(b); b is not defined 打印的结果是b这个变量没用定义 3…

9.Admin后台系统

9. Admin后台系统 Admin后台系统也称为网站后台管理系统, 主要对网站的信息进行管理, 如文字, 图片, 影音和其他日常使用的文件的发布, 更新, 删除等操作, 也包括功能信息的统计和管理, 如用户信息, 订单信息和访客信息等. 简单来说, 它是对网站数据库和文件进行快速操作和管…

Xinlinx FPGA如何降低Block RAM的功耗

FPGA中降低Block RAM的功耗有两种方式&#xff0c;分别是选择合适的写操作模式以及Block RAM的实现算法及综合设置。我们知道对于采用IP核生成对应的RAM时&#xff0c;会有最小面积算法、低功耗算法以及固定原语&#xff0c;但是采用最小功耗算法有时由于级联长度导致无法实现&…

Listview控件的5种视图

在C#中&#xff0c;ListView控件是用于显示和编辑列表数据的常用控件。它可以显示数据项的列表&#xff0c;并允许用户对列表中的数据进行操作。 ListView控件有五种视图模式&#xff0c;分别是&#xff1a; LargeIcon视图&#xff1a;在此视图中&#xff0c;每个数据项都显示…

详解xml-java语言

1.XML在线学习手册 XML 教程 2.XML可以做什么 1.给两个程序之间进行数据通信。现在用的最多的是JSON。 2.给服务器做配置文件。 3.存储复杂的数据关系。 4.还可以充当小型的数据库。 3.书写格式 <?xml version"1.0" encoding"UTF-8" ?> <…

ctfshow web入门 sql注入 web224--web233

web224 扫描后台&#xff0c;发现robots.txt&#xff0c;访问发现/pwdreset.php &#xff0c;再访问可以重置密码 &#xff0c;登录之后发现上传文件 检查发现没有限制诶 上传txt,png,zip发现文件错误了 后面知道群里有个文件能上传 <? _$GET[1]_?>就是0x3c3f3d60245…

#9松桑前端后花园周刊-React19beta、TS5.5beta、Node22.1.0、const滥用、jsDelivr、douyin-vue

行业动态 Mozilla 提供 Firefox 的 ARM64 Linux二进制文件 此前一直由发行版开发者或其他第三方提供&#xff0c;目前Mozilla提供了nightly版本&#xff0c;正式版仍需要全面测试后再推出。 发布 React 19 Beta 此测试版用于为 React 19 做准备的库。React团队概述React 19…

仅为娱乐,Python中如何重定义True为False?

在Python中&#xff0c;True 和 False 是内建的布尔常量&#xff0c;分别代表逻辑上的真和假。它们是不可变的&#xff0c;且在Python语言规范中具有特殊地位&#xff0c;不能被用户直接重定义。尝试给 True 或 False 赋予新的值是违反Python语言规则的&#xff0c;这样的操作会…