【杨氏矩阵】

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

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

//杨氏矩阵
#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);elseprintf("找不到");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");elseprintf("找到了,下标是:%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.hqwc.cn/news/26539.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微服务系列文章 之SpringBoot之定时任务详解

序言 使用SpringBoot创建定时任务非常简单&#xff0c;目前主要有以下三种创建方式&#xff1a; 一、基于注解(Scheduled)二、基于接口&#xff08;SchedulingConfigurer&#xff09; 前者相信大家都很熟悉&#xff0c;但是实际使用中我们往往想从数据库中读取指定时间来动态…

机器学习-线性代数-5-空间中的向量投影与最小二乘法

空间中的向量投影与最小二乘法 文章目录 空间中的向量投影与最小二乘法一、引入二、投影和投影的描述1、投影描述最近2、利用矩阵描述投影(1)向一维直线投影(2)向二维平面投影(3)向n维子空间投影的一般情况 三、最小二乘法1、重要的子空间(1)互补的子空间(2)正交的子空间(3)相互…

微服务day1

一、认识微服务 1、单体架构 将业务的所有功能集中在一个项目中开发&#xff0c;打成一个包部署。 优点 架构简单部署成本低 缺点 耦合度高 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fPfsQXAn-1689593800699)(https://picture.wangkay.tec…

gitee 使用

1.打开git bash 2.cd 进入到合适位置 3.git clone 项目 4.配置用户名和email&#xff08;不然没法记录谁操作的&#xff09; pycharm &#xff08;ctrlk&#xff09;

如何设计一个注册中心?(2)实现注册接口

1. 创建SpringBoot工程 创建父工程及三个子模块&#xff0c;其中一个模块作为注册中心&#xff0c;另外两个作为服务提供者。 pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns…

pytorch保存、加载和解析模型权重

1、模型保存和加载 主要有两种情况&#xff1a;一是仅保存参数&#xff0c;二是保存参数及模型结构。 保存参数&#xff1a; torch.save(net.state_dict()) 加载参数&#xff08;加载参数前需要先实例化模型&#xff09;&#xff1a; param torch.load(param.pth) net.load_…

2023最新版本Activiti7系列-身份服务

身份服务 在流程定义中在任务结点的 assignee 固定设置任务负责人&#xff0c;在流程定义时将参与者固定设置在.bpmn 文件中&#xff0c;如果临时任务负责人变更则需要修改流程定义&#xff0c;系统可扩展性差。针对这种情况可以给任务设置多个候选人或者候选人组&#xff0c;可…

vue-next-admin vue3.x版本,table自定义

vue3.x版本&#xff0c;将table进行了封装。使用起来更方便了。但是&#xff0c;有时候我们需要将一组信息显示到一列中。所以我将其进行了简单的二次改造。支持table-column自定义。 table改造代码 <template><div class"table-container"><el-tabl…

【Ajax】笔记-POST请求(原生)

POST请求 html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>AJAX POST 请求</title><…

VScode——NPM脚本窗口找不到

一、问题描述&#xff08;NPM终端在任务栏左侧找不到&#xff09; VScode&#xff08;Visual Studio Code&#xff09;版本&#xff1a;1.79.2 二、解决办法 第一步&#xff1a;通过设置/用户设置/扩展/MPM更改NPM默认配置&#xff0c;如下图所示&#xff1a; 第二步&#xff…

springboot实现全局异常捕获

导言&#xff1a; 为什么要做异常处理&#xff1a; 原因有三&#xff1a; 1、将系统产生的全部异常统一捕获处理。 2、自定义异常需要由全局异常来捕获。 3、JSR303规范的validator参数校验器、参数校验不通过、本身无法使用try…catch 其实对于前后端分离的项目做异常处理…

分布式应用之Zookeeper和Kafka

分布式应用之Zookeeper和Kafka 一、Zookeeper 1.定义 分布式系统管理框架&#xff0c;主要用来解决分布式集群中应用系统的一致性问题 相当于各种分布式应用服务的 注册中心 文件系统 通知机制2.特点 &#xff08;1&#xff09;Zookeeper&#xff1a;一个领导者&#…