【杨氏矩阵】

news2024/12/25 0:55:06

这篇文章的对应思维导图为:思维导图

在这里插入图片描述
思维导图对应代码:

//杨氏矩阵
#include<stdio.h>

//void ysjz1(int a[3][3],int k) {
//	int x = 0;
//	int y = 2;
//	while (x <= 2 && y >= 0) {
//		if (a[x][y] > k) {
//			y--;
//		}
//		else if (a[x][y] < k) {
//			x++;
//		}
//		else {
//			printf("%d %d", x, y);
//			return ;
//		}
//	}
//	printf("找不到");
//}

//void ysjz2(int(*a)[3], int k) {
//	int x = 0;
//	int y = 2;
//	while (x <= 2 && y >= 0) {
//		if (a[x][y] > k) {
//			y--;
//		}
//		else if (a[x][y] < k) {
//			x++;
//		}
//		else {
//			printf("%d %d", x, y);
//			return ;
//		}
//	}
//	printf("找不到");
//}

//int ysjz3(int(*a)[3],int k,int* px,int* py) {
//	int x = 0;
//	int y = *py-1;
//
//	while (x <= (*px - 1) && y >= 0) {
//		if (a[x][y] > k) {
//			y--;
//		}
//		else if (a[x][y] < k) {
//			x++;
//		}
//		else {
//			//printf("%d %d", x, y);
//			*px = x;
//			*py = y;
//			return 1;
//		}
//	}
//	//printf("找不到");
//	return 0;
//}

int main() {
	int a[3][3] = { 1,2,3,4,5,6,7,8,9 };
	//1 2 3
	//4 5 6 
	//7 8 9
	//元素3在第0行第2列
	int x = 3;
	int y = 3;

	int k = 0;
	scanf_s("%d", &k);

	//ysjz1(a, k);
	//ysjz2(a, k);
	if(ysjz3(a, k, &x, &y))
		printf("%d %d", x, y);
	else
		printf("找不到");
	return 0;
}

题目描述:
有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。要求:时间复杂度小于O(N);

对于杨氏矩阵而言,右上角和左下角的元素是有特点的。右上角的元素是一行中最大的,一列中最小的。左下角的元素是一行中最小的,是一列中最大的。所以我们可以从右上角或者左下角开始查找。比如:从右上角开始查找的时候,右上角的元素比我们要查找元素小,我们就可以去掉右上角元素所在的这一行;右上角的元素比我们要查找的元素大,我们就可以去掉右上角元素所在的这一列。然后依然找右上角的元素继续和要查找的元素与比较。这样每一次比较去掉一行或者去掉一列。这个查找效率是高于遍历数组元素的,所以时间复杂度是小于O(N),也满足题目要求。


问题解决:

1 2 3
4 5 6
7 8 9

3是第一行的最大值,也是第三列的最小值。将要查找的数字和3比较,如果比3大就加到下一行,如果比3小就减到前一列,但是,行和列有范围,当在这个范围内还没有找到就打印找不到。

#include<stdio.h>

int main()
{
	int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
	
	int k = 0;
	scanf_s("%d", &k);
	//在VS2019中使用了scanf_s,其实和scanf一样的作用
	int x = 0;
	int y = 2;
	//初始化为3所在的位置

	int flag = 0;

	while (x<=2 && y>=0)
	{
		if (arr[x][y] < k)
		{
			x++;
			//行数加一
		}
		else if (arr[x][y] > k)
		{
			y--;
			//列数减一
		}
		else
		{
			printf("找到了,下标是:%d %d\n", x, y);
			flag = 1;
			//找到之后就记录对应下标并且将标志设置为1然后推出循环
			break;
		}
	}
	if (flag == 0)
		printf("找不到\n");

	return 0;
}

封装为函数并且带回返回值:

#include<stdio.h>

void young_tableau_search(int arr[3][3], int k, int *px, int *py)
{
	int x = 0;
	int y = *py-1;

	int flag = 0;
	
	while (x <= *px-1 && y >= 0)
	{
		if (arr[x][y] < k)
		{
			x++;
		}
		else if (arr[x][y] > k)
		{
			y--;
		}
		else
		{
			*px = x;
			*py = y;
			return;
		}
	}
	*px = -1;
	*py = -1;
}

int main()
{
	int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
	int k = 0;
	scanf_s("%d", &k);

	int x = 3;
	int y = 3;
	
	young_tableau_search(arr, k, &x, &y);

	if (x == -1 && y == -1)
		printf("找不到\n");
	else
		printf("找到了,下标是:%d %d\n", x, y);
	
	return 0;
}
#include <stdio.h>

int findnum(int a[][3], int x, int y, int f) //第一个参数的类型需要调整
{
	int i = 0, j = y - 1; //从右上角开始遍历
	while (j >= 0 && i < x)
	{
		if (a[i][j] < f) //比我大就向下
		{
			i++;
		}
		else if (a[i][j] > f) //比我小就向左
		{
			j--;
		}
		else
		{
			return 1;
		}
	}
	return 0;
}

int main()
{
	int a[][3] = { {1, 3, 5},
				  {3, 5, 7},
				  {5, 7, 9} };

	if (findnum(a, 3, 3, 2))
	{
		printf("It has been found!\n");
	}
	else
	{
		printf("It hasn't been found!\n");
	}

	return 0;
}

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

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

相关文章

算法训练营第三十六天||● 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间

● 435. 无重叠区间 解法1&#xff1a; 本题其实和452.用最少数量的箭引爆气球 (opens new window)非常像&#xff0c;弓箭的数量就相当于是非交叉区间的数量&#xff0c;只要把弓箭那道题目代码里射爆气球的判断条件加个等号&#xff08;认为[0&#xff0c;1][1&#xff0c;…

【嵌入式Qt开发入门】Qt如何网络编程——获取本机的网络信息

Qt 网络模块为我们提供了编写TCP/IP客户端和服务器的类。它提供了较低级别的类&#xff0c;例如代表低级网络概念的 QTcpSocket&#xff0c;QTcpServer 和 QUdpSocket&#xff0c;以及诸如 QNetworkRequest&#xff0c; QNetworkReply 和 QNetworkAccessManager 之类的高级类来…

2023世界人工智能大会,和鲸科技入选中国信通院《2023大模型和AIGC产业图谱》

近日&#xff0c;2023 世界人工智能大会&#xff08;WAIC&#xff09;“聚焦大模型时代 AIGC 新浪潮”论坛上&#xff0c;中国信息通信研究院&#xff08;以下简称“中国信通院”&#xff09;正式发布《2023 大模型和AIGC产业图谱》&#xff08;以下称“图谱”&#xff09;。和…

一、简易搭建本地CAS服务端

CAS服务端war包下载 https://repo1.maven.org/maven2/org/apereo/cas/cas-server-webapp-tomcat/5.3.14/ 可使用迅雷下载cas-server-webapp-tomcat-5.3.14.war &#xff0c;速度很快 将wab包放到本地tomcat的webapps下D:\tomcat\apache-tomcat-8.5.63\webapps\cas\WEB-INF\clas…

springboot项目实战-API接口限流

1.简介 对接口限流的目的是通过对并发访问/请求进行限速&#xff0c;或者对一个时间窗口内的请求进行限速来保护系统&#xff0c;一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理。 1.1.为什么需要限流? 大量正常用户高频访问导致服务器宕机恶意用户高频访问导致服…

国产SAAS平台中类似Jira的有哪些值得关注的选择?

在项目管理市场中&#xff0c;Jira是一款非常知名的软件工具。它可以帮助团队成员更好地管理和协作&#xff0c;提高项目效率和质量。然而&#xff0c;Jira并不是完美的&#xff0c;存在诸如复杂操作、高昂费用等不足之处。因此&#xff0c;许多国内企业开始尝试寻找替代品&…

Yolov7配置CoCo精度显示问题实操

1、安装pycocotools工具&#xff0c; 使用yolov7项目中test.py&#xff0c;安装pycocotools时&#xff0c;命令无法直接安装成功。 本次操作在Linux上进行&#xff1a; GitHub - cocodataset/cocoapi: COCO API - Dataset http://cocodataset.org/COCO API - Dataset http:…

uniapp 打包安卓apk (原生App)云打包

uniapp 打包安卓apk (原生App)云打包 hbuilder中操作 项目的一些配置appid DCloud appid 用途/作用/使用说明&#xff1a; https://ask.dcloud.net.cn/article/35907 右键我们项目目录-》发行-》原生APP-云打包 说明&#xff1a; 1. 打包安卓&#xff0c;只选择安卓打包项&…

【Pytest】Allure测试报告的安装与环境配置

文章目录 一、安装配置JAVA环境1、下载jdk2、配置环境变量3、检验 二、安装allure-pytest插件三、下载安装Allure1、下载allure2、配置环境变量3、检验 一、安装配置JAVA环境 Allure基于Java开发&#xff0c;因此需要提前安装Java 8 或以上版本的环境。 1、下载jdk jdk下载地…

2023愚人杯-easy_base

0x00 前言 CTF 加解密合集&#xff1a;CTF 加解密合集 0x01 题目 4C455A5645334C44474A55484D5A42544F5132574956525A50464E464F4E4C474D4656454D334359474A554751564B4949493255535532464E42544643504A350x02 Write Up 直接通过现成的工具即可&#xff1a; 以上

C++教程——STL

STL基本概念 容器算法迭代器 Vector容器 vector存放内置数据类型 vector存放自定义数据类型 vector容器嵌套容器 string容器 string的构造函数 string赋值操作 string字符串拼接 string查找与替换 string字符串比较 string字符存取 string插入与删除 string字串获取

React+Antd+Typescript:封装条件查询组件

文章目录 概要整体架构思路概要 这是筛选组件的效果图。一般使用场景,根据需求快速筛选出符合条件的数据。 那么这个筛选组件,就是默认一些常见的条件,比如明天或者昨天,虽然这个条件,我们可以通过antd的日期控件来实现,但缺点就是操作起来有点麻烦。通过预设一些条件,…

学习记录——BiSeNetV1、BiSeNetV2、BiSeNetV3、PIDNet

BiSeNetV1 BiSeNetV1为了在不影响速度的情况下&#xff0c;同时收集到空间信息和语义信息&#xff0c;设计了两条路&#xff1a; Spatial Path: 用了三层stride为 2 的卷积&#xff0c;卷积BNRELU模块。最后提取了相当于原图像 1/8 的输出特征图。由于它利用了较大尺度的特征图…

C++_简单模拟实现string的增删查改

目录 一、模拟reserve 二、模拟push_back 三、模拟append 四、模拟operator 五、模拟insert 六、模拟erase 七、模拟find 八、模拟substr 一、模拟reserve 要添加数据&#xff0c;首先要考虑的是扩容。有必要用reserve辅助扩容。reserve的作用就是给一个预期的值作为扩…

【雕爷学编程】Arduino动手做(138)---64位WS2812点阵屏模块4

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

Vue源码分析拓展 - 响应式系统搭建

Vue里面如何追踪变化 当你把一个普通的JavaScript对象传入Vue实例作为data选项&#xff0c;Vue将遍历此对象所有的属性&#xff0c;并使用Object.defineProperty把这些属性全部转为getter/setter. 这些getter/setter.对用户来说是不可见的&#xff0c;但是在内部他们让Vue能够…

Nginx配置汇总

一、Nginx概念 Nginx是目前负载均衡技术中的主流方案&#xff0c;几乎绝大部分项目都会使用它&#xff0c;Nginx是一个轻量级的高性能HTTP反向代理服务器&#xff0c;同时它也是一个通用类型的代理服务器&#xff0c;支持绝大部分协议&#xff0c;如TCP、UDP、SMTP、HTTPS等。…

Java028——Runtime 类

一、Runtime 类介绍 Runtime 类是JDK 提供的运行时类&#xff0c;该类为 Java 程序提供了与当前运行环境相连接的一个通道,Java 程序可以利用该类对当前的运行环境执行一些简单的操作。 二、Runtime 对象的创建 Runtime 类对象不能使用 new 关键字创建&#xff0c;只能通过 …

【LeetCode: 167. 两数之和 II - 输入有序数组 | 双指针专题 】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

C++之final关键字用法(一百六十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…