C语言:杨氏矩阵中查找某数(时间复杂度小于O(N))

news2024/11/25 1:38:49

题目:

有一个数字矩阵二维数组),

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

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

                    

 =========================================================================

                       

思路:

总体思路:

(1).

自定义函数:

           

实现逻辑

因为是杨氏矩阵,所以一行中最右边的数是最大的

这个最大值如果比要找的值都小的话,那就可以排除这一行

列也是同理

                  

函数参数接收 二维数组名要查找的数

存放矩阵行数的变量的指针(地址)存放矩阵列数的变量的指针(地址)

                  

通过两个变量找出二维数组第一行的最大值

              

使用 while循环 ,如果未查找到 二维数组的最大行数 且 列数未到最小列

行的最右边的数是最大的列逐渐判断直到最小列

继续查找

          

(2).

while循环中

                

使用 if条件判断语句判断第一行最大值是否小于要找的值

          

如果小于那么这一行不可能有要查找的值,可以排除这一行指针移到下一行

          

如果最大值大于要查找的值,那么该值就在这一行,逐渐移动列数在改行进行查找

          

如果要查找的值直接就和该行最大值相等通过调整行数和列数找到了

          

通过 矩阵的行数列数变量的指针 设置找到的行数和列数

                 

跳出循环还未找到的话,则将k的“坐标”设置为(-1,-1)表未找到

                       

(3).

主函数:

          

给出一个杨氏矩阵二维数组),

            

输入要在矩阵中找的数

               

设置矩阵的 行 和 列

             

使用自定义函数进行查找

函数参数二维数组名要查找的数

矩阵行数变量的指针(地址)矩阵列数变量的指针(地址)

                      

通过函数的查找情况打印相应情况

                


                 

第一步:

自定义函数:

           

实现逻辑

因为是杨氏矩阵,所以一行中最右边的数是最大的

这个最大值如果比要找的值都小的话,那就可以排除这一行

列也是同理

                  

函数参数接收 二维数组名要查找的数

存放矩阵行数的变量的指针(地址)存放矩阵列数的变量的指针(地址)

                  

通过两个变量找出二维数组第一行的最大值

              

使用 while循环 ,如果未查找到 二维数组的最大行数 且 列数未到最小列

行的最右边的数是最大的列逐渐判断直到最小列

继续查找

                     

实现代码:

#include <stdio.h>

//自定义函数:
void young_table_search(int arr[3][3], int k, int* px, int* py)
{
	//通过两个变量找出二维数组第一行的最大值:
	//行和列是从0开始的,
	int x = 0; //二维数组的行,从第一行进行查找
	int y = *py - 1; //二维数组的列,从最大列开始查找,

	//使用 while循环 进行查找:
	while (x<=*px-1 && y>=0)
		//x<=*px-1  -- 未查找到最大行数
		//y>=0  --  未调整到最小列数
	{


	}
}

int main() 
{


	return 0;
}

实现图片:

                 


                 

第二步:

在while循环中:

                

使用 if条件判断语句判断第一行最大值是否小于要找的值

          

如果小于那么这一行不可能有要查找的值,可以排除这一行指针移到下一行

          

如果最大值大于要查找的值,那么该值就在这一行,逐渐移动列数在改行进行查找

          

如果要查找的值直接就和该行最大值相等通过调整行数和列数找到了

          

通过 矩阵的行数列数变量的指针 设置找到的行数和列数

                 

跳出循环还未找到的话,则将k的“坐标”设置为(-1,-1)表未找到

                     

实现代码:

#include <stdio.h>

//自定义函数:
void young_table_search(int arr[3][3], int k, int* px, int* py)
{
	//通过两个变量找出二维数组第一行的最大值:
	//行和列是从0开始的,
	int x = 0; //二维数组的行,从第一行进行查找
	int y = *py - 1; //二维数组的列,从最大列开始查找,

	//使用 while循环 进行查找:
	while (x<=*px-1 && y>=0)
		//x<=*px-1  -- 未查找到最大行数
		//y>=0  --  未调整到最小列数
	{
		if (arr[x][y] < k)
			//第一行最大值 小于 k
		{
			x++; //排除这一行,移到下一行
		}
		else if (arr[x][y] > k)
			//第一行最大值 大于 k
		{
			y--; //k就在这一行,移到列进行查找
		}
		else
			//找到了:把k的行和列赋给指针px和py
		{
			*px = x;
			*py = y;
			return;
		}
	}
	//自定义未找到的情况:
	*px = -1;
	*py = -1;
}

int main() 
{


	return 0;
}

实现图片:

                 


                 

第三步:

主函数:

          

给出一个杨氏矩阵二维数组),

            

输入要在矩阵中找的数

               

设置矩阵的 行 和 列

             

使用自定义函数进行查找

函数参数二维数组名要查找的数

矩阵行数变量的指针(地址)矩阵列数变量的指针(地址)

                      

通过函数的查找情况打印相应情况

                     

实现代码:

#include <stdio.h>

//自定义函数:
void young_table_search(int arr[3][3], int k, int* px, int* py)
{
	//通过两个变量找出二维数组第一行的最大值:
	//行和列是从0开始的,
	int x = 0; //二维数组的行,从第一行进行查找
	int y = *py - 1; //二维数组的列,从最大列开始查找,

	//使用 while循环 进行查找:
	while (x<=*px-1 && y>=0)
		//x<=*px-1  -- 未查找到最大行数
		//y>=0  --  未调整到最小列数
	{
		if (arr[x][y] < k)
			//第一行最大值 小于 k
		{
			x++; //排除这一行,移到下一行
		}
		else if (arr[x][y] > k)
			//第一行最大值 大于 k
		{
			y--; //k就在这一行,移到列进行查找
		}
		else
			//找到了:把k的行和列赋给指针px和py
		{
			*px = x;
			*py = y;
			return;
		}
	}
	//自定义未找到的情况:
	*px = -1;
	*py = -1;
}

int main() 
{
	//给出一个杨氏矩阵:
	int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
	//					1 2 3
	//					4 5 6
	//					7 8 9

	//输入要找的数:
	int k = 0;
	scanf("%d", &k);

	//设置矩阵的行和列:
	int x = 3; //矩阵的行
	int y = 3; //矩阵的列

	//使用自定义函数进行查找:
	young_table_search(arr, k, &x ,&y);

	//根据情况大于相应情况:
	if (x==-1 && y==-1)
		//未找到
	{
		printf("未找到");
	}
	else
		//找到了
	{
		printf("找到了,它的下标为:第%d行 第%d列", x, y);
	}

	return 0;
}

实现图片:

                       

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                        

最终代码和实现效果

最终代码:

#include <stdio.h>

//自定义函数:
void young_table_search(int arr[3][3], int k, int* px, int* py)
{
	//通过两个变量找出二维数组第一行的最大值:
	//行和列是从0开始的,
	int x = 0; //二维数组的行,从第一行进行查找
	int y = *py - 1; //二维数组的列,从最大列开始查找,

	//使用 while循环 进行查找:
	while (x<=*px-1 && y>=0)
		//x<=*px-1  -- 未查找到最大行数
		//y>=0  --  未调整到最小列数
	{
		if (arr[x][y] < k)
			//第一行最大值 小于 k
		{
			x++; //排除这一行,移到下一行
		}
		else if (arr[x][y] > k)
			//第一行最大值 大于 k
		{
			y--; //k就在这一行,移到列进行查找
		}
		else
			//找到了:把k的行和列赋给指针px和py
		{
			*px = x;
			*py = y;
			return;
		}
	}
	//自定义未找到的情况:
	*px = -1;
	*py = -1;
}

int main() 
{
	//给出一个杨氏矩阵:
	int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
	//					1 2 3
	//					4 5 6
	//					7 8 9

	//输入要找的数:
	int k = 0;
	scanf("%d", &k);

	//设置矩阵的行和列:
	int x = 3; //矩阵的行
	int y = 3; //矩阵的列

	//使用自定义函数进行查找:
	young_table_search(arr, k, &x ,&y);

	//根据情况大于相应情况:
	if (x==-1 && y==-1)
		//未找到
	{
		printf("未找到");
	}
	else
		//找到了
	{
		printf("找到了,它的下标为:第%d行 第%d列", x, y);
	}

	return 0;
}

实现效果

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

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

相关文章

Linux中docker的基本操作

文章目录 一、docker概述1.1 什么是docker1.2 Docker与虚拟机的特性区别1.3 容器在内核中支持2种重要技术1.4 docker的核心概念 二、安装docker三、Docker 镜像操作四、Docker 容器操作 一、docker概述 1.1 什么是docker 是一个开源的应用容器引擎&#xff0c;基于go语言开发…

Spring Web MVC 详解(1)

目录 一、介绍 MVC 二、Spring MVC 的三个基本功能 1.1 连接功能 1.2 Spring MVC 的创建和使用 1.3 RequestMappig 介绍 1.4 Spring MVC 实现用户和 Spring 程序的连接 1.5 GetMapping 和 PostMaping 注解 1.6 Get 和 Post请求注解的多种写法 2.1 获取请求中参数的功…

Redis的内存回收与内存淘汰策略

对于redis这样的内存型数据库而言&#xff0c;如何删除已过期的数据以及如何在内存满时回收内存是一项很重要的工作。 常见的redis内存回收的工作主要分为两个方面&#xff1a; 清理过期的key在内存不足时回收到足够的内存用以存储新的key 清理过期的key 我们很少在redis中…

直接插入排序、希尔排序、直接选择排序、堆排序、冒泡排序——“数据结构与算法”

各位CSDN的uu们你们好呀&#xff0c;今天小雅兰的内容是数据结构与算法啦&#xff0c;是排序&#xff01;&#xff01;&#xff01;下面&#xff0c;让我们进入七大排序的世界吧&#xff01;&#xff01;&#xff01; 排序的概念及其运用 排序的概念 排序&#xff1a;所谓排序…

算法提高-动态规划-斜率优化DP

斜率优化DP AcWing 300. 任务安排1AcWing 301. 任务安排2AcWing 302. 任务安排3AcWing 303. 运输小猫 AcWing 300. 任务安排1 #include <iostream> #include <cstring>typedef long long LL;using namespace std;const int N 5e3 10;int st[N], sc[N]; LL f[N];…

全志F1C200S嵌入式驱动开发(基于usb otg的spi-nor镜像烧入)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 前面既然已经搞定了spi-nor驱动,那么下一步考虑的就是怎么从spi-nor flash上面加载uboot、kernel和rootfs。目前spi-nor就是一块白片,上面肯定什么都没有,那么这个时候,我们要做…

贤鱼的刷题日常-P3375 【模板】KMP 字符串匹配

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;例题讲解P3375 【模板】KMP 字符串匹配 ✅创作者&#xff1a;贤鱼 ⏰预计时间&#xff1a;25分钟 &#x1f389;个人主页&#xff1a;贤鱼的个人主页 &#x1f525;专栏系列&#xff1a;c &#x1f341;贤鱼的个人社区&…

(css)清除el-table背景色

(css)清除el-table背景色 效果&#xff1a; <el-table:data"gridData":header-cell-style"{text-align:center,color: #fff}":cell-style"{text-align:center,color: #fff }" ><el-table-column type"index" label"序号…

linux下 UART串口相关

RS232的串口设备在linux 上会被识别为 /dev/ttyS* 或者 ttymxc* 一、串口简介 操作串口我们一般通过以下指令&#xff1a; 1、查看串口波特率等信息&#xff1a; stty -F /dev/ttyS0 -a #ttyS0为要查看的串口 2、设置串口参数&#xff1a; stty -F /dev/ttyS0 ispeed 115…

Qt实现双控制柄的Slider

目标 实现带有左右两个控制柄的滑动条&#xff1b;控件可设定最小值和最大值&#xff1b;控件可设定控制柄的最小距离&#xff1b; 效果演示 思路 1. 标准的Slider控件只有一个Handle&#xff0c;所以想要通过改造QSlider来实现两个Handle是非常困难的&#xff0c;“自绘”…

SpringBoot+jasypt-spring-boot-starter实现配置文件明文加密

1.使用环境 springboot:2.1.4.RELEASE JDK:8 jasypt-spring-boot-starter:3.0.2 2.引入依赖 !-- 配置文件加密 --> <dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><ver…

rust学习-智能指针

适用场景 有一个在编译时未知大小的类型&#xff0c;想在需要确切大小的上下文使用该类型值 示例1 无意义的例子&#xff1a;将一个单独的值存放在堆上并不是很有意义&#xff0c;b更应该放到栈上 fn main() {let b Box::new(5);// box 在 main 的末尾离开作用域时&#x…

R语言 PCA筛选变量

#PCA-筛选变量 X <- data[,2:415] pca <- prcomp(X, center TRUE, scale. TRUE) # 进行主成分分析 summary(pca) # 查看各个主成分的解释方差比例 library(factoextra) #碎石图依赖-fviz fviz_eig(pca,addlabelsT) #碎石图 X_selected <- pca$x[,1:20] # 选择前n个主…

pytorch实现图像投影变换

import cv2 import torchdef cpu_remap(numpy_img,mapx,mapy):return cv2.remap(numpy_img,mapx,mapy,cv2.INTER_LINEAR)def gpu_remap(numpy_img,map_tensor):numpy_img:原始图像格式为ndarraymap_tensor:[N,H,W,C]用于grid_sample的map参数&#xff0c;需要规制到-1到1# 准备…

opencv直方图

#include "iostream" #include "opencv2/opencv.hpp" using namespace std; using namespace cv;int main() {Mat img, gray;img imread("r4.jpg");cvtColor(img, gray, COLOR_BGR2GRAY);int nimages 1;//图片数量const int channels[] { 0 …

信捷PLC RC低通滤波器(C语言实现)

PLC信号处理系列之RC低通滤波器算法详细介绍请参考下面文章: PLC信号处理系列之一阶低通(RC)滤波器算法_plc滤波算法程序_RXXW_Dor的博客-CSDN博客1、先看看RC滤波的优缺点 优点:采用数字滤波算法来实现动态的RC滤波,则能很好的克服模拟滤波器的缺点; 1、在模拟常数要求较…

位域与共用体在通讯领域的应用

最近看到些代码&#xff0c;定义变量还能指定位宽&#xff0c;很有意思。像这样 unsigned int bit1 : 1;冒号 (&#x1f603; 后面的数字1表示变量的位宽或大小。 像这样的大小声明在低级编程和位操作中常被使用&#xff0c;以便精确控制变量的大小。 通讯协议解析用的多。 下面…

电脑安装双系统ubuntu18.04+windows后开机直接进入Windows解决方法

电脑型号&#xff1a;联想拯救者Y9000K2021H 系统&#xff1a;Windows11Ubuntu18.04双系统 问题&#xff1a;笔记本安装双系统后&#xff0c;Windows系统下处理word或者看论文&#xff1b;Ubuntu18.04系统安装ros进行机械臂控制等的研究。但最近开机后发现没有系统选项了&#…

【mars3d】将mars3d中的示例拷贝到自己项目中

mars3d 的功能示例 - 感觉做了很多的处理&#xff1b; 1、头部的按钮作用 重置和运行 - 这就是字面意思&#xff0c;都能理解哈&#xff1b; js - 顾名思义&#xff0c;js代码&#xff0c;也是我们可以改动的部分&#xff1b; 旁边那个 - 是vue部分&#xff0c;是不能修改的…

J2EE通用分页01

目录 一.总体思路 二.分页信息实体&#xff08;PageBean&#xff09; 三.后台分页数据查询 3.1 处理流程 流程图&#xff1a; 3.2 实现 Student实体&#xff0c;及对应的数据库表可自行准备 四.重构-提取公用方法 1.为了进行公共方法的抽取&#xff0c;需要找出上面实…