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

题目:

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

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

要求:时间复杂度小于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.mzph.cn/news/5998.shtml

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

相关文章

《零基础入门学习Python》第057讲:论一只爬虫的自我修养5:正则表达式

如果你在课后有勤加练习&#xff0c;那么你对于字符串的查找应该是已经深恶痛绝了&#xff0c;你发现下载一个网页是很容易的&#xff0c;但是要在网页中查找到你需要的内容&#xff0c;那就是困难的&#xff0c;你发现字符串查找并没有你想象的那么简单&#xff0c;并不是说直…

(已解决)RuntimeError: Java gateway process exited before sending its port number

今天用Pycharm远程使用pysaprk解释器时&#xff0c;跑代码出现了这个错误&#xff1a; RuntimeError: Java gateway process exited before sending its port number 找了好多博客都没解决问题&#xff0c;有说重装spark的&#xff0c;有说本地配Java_home的&#xff0c;后面我…

leetcode 47. 全排列 II

2023.7.23 这道题是上一题全排列 的一个升级版。 唯一区别就是需要增加一个树层去重的操作&#xff0c;因为数组nums中允许有重复的元素了&#xff0c;而上一题没有重复元素。 下面看代码&#xff1a; class Solution { public:vector<vector<int>> ans;vector<…

如何评测一个大语言模型?

编者按&#xff1a;大型语言模型&#xff08;Large language models, LLMs&#xff09;因其在学术界和工业界展现出前所未有的性能而备受青睐。随着 LLMs 在研究和实际应用中被广泛使用&#xff0c;对其进行有效评测变得愈发重要。近期已有多篇论文围绕大模型的评测进行研究&am…

RocketMQ教程-(4)-领域模型-消费者分组ConsumerGroup

定义​ 消费者分组是 Apache RocketMQ 系统中承载多个消费行为一致的消费者的负载均衡分组。 和消费者不同&#xff0c;消费者分组并不是运行实体&#xff0c;而是一个逻辑资源。在 Apache RocketMQ 中&#xff0c;通过消费者分组内初始化多个消费者实现消费性能的水平扩展以…

【云原生】Docker网络及Cgroup资源控制

一、Docker网络 1.docker网络实现原理 Docker使用Linux桥接&#xff0c;在宿主机虚拟一个Docker容器网桥(docker0)&#xff0c;Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址&#xff0c;称为Container-IP&#xff0c;同时Docker网桥是每个容器的默认网关。…

微信小程序——页面跳转方法和场景用法总结

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

如何理解spring cloud 和 spring cloud Alibaba

Spring Cloud是一个基于Spring Framework构建的用于开发和构建分布式系统的开源框架。它提供了一系列的工具和组件&#xff0c;用于帮助开发者快速构建、部署和管理微服务架构。Spring Cloud提供了包括服务发现、配置管理、负载均衡、断路器等在内的众多功能。 Spring Cloud A…

【JVM】JVM执行流程 JVM类加载 垃圾回收机制等

目录 &#x1f337;1、JVM是什么&#xff1f; &#x1f337;2、JVM的执行流程&#xff08;能够描述数据区5部分&#xff09; &#x1f337;3、JVM类加载过程 &#x1f337;4、双亲委派机制&#xff1a;描述类加载的过程 问题1&#xff1a;类加载器 问题2&#xff1a;什么…

支付宝原生小程序组件与父级传递数据(微信小程序基本一样)

1. 声明组件 在对应的目录下,右击点击 新建小程序,之后会生成对应的文件 2. 子组件 Component({data: {colorList: [#165FF6, #3D16F6,

一元多项式的表示及相加

实现思路&#xff1a; 通过链表实现&#xff0c;会更为简单直观。用链表中的每个结点表示多项式中的每一项&#xff0c;多项式每一项都是由数据域&#xff08;包含系数和指数&#xff09;和指针域构成的&#xff0c;所以在定义表示结点的结构体时&#xff0c;可如下所示进行定义…

FFMPEG android mac 编译 支持DASH/OPENSSL问题汇总

一 下载源码 FFMPEG https://github.com/FFmpeg/FFmpeg/tree/release/4.3 二 编写脚本 支持https 就必须添加open SSL 的编译 具体可以查看我的另一个关于open SSL 的 然后我们配置的一些路径 涉及 ndk 的一定要查看你用的ndk 版本 是否存在这些路径这是第一步 然后如果支…

python爬虫入门

基础回顾 使用函数, 先导入, 直接点方法名使用 import math m math.log10(100) print(m)python 交互模式 input输入示例 age int(input("请输入年龄")) age 1 print(age)if else 的使用 和java一样, 只是不加括号, else if 阉割成了 elif 与或非 java : &am…

No3: 学习过程中故障成长积累

文章目录 故障积累1、编码错误导致 故障积累1、编码错误导致

5.2 Bootstrap 过渡效果(Transition)插件

文章目录 Bootstrap 过渡效果&#xff08;Transition&#xff09;插件使用案例 Bootstrap 过渡效果&#xff08;Transition&#xff09;插件 过渡效果&#xff08;Transition&#xff09;插件提供了简单的过渡效果。 注意&#xff1a;如果您想要单独引用该插件的功能&#xff0…

【ACM】—蓝桥杯大一暑期集训Day5

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;陈童学哦&#xff0c;目前正在学习C/C、Java、算法等方向&#xff0c;一个正在慢慢前行的普通人。 &#x1f3c0;系列专栏&#xff1a;陈童学的日记 &#x1f4a1;其他专栏&#xff1a;CSTL&#xff…

Qt6 Qt Quick UI原型学习QML第五篇

文章目录 效果QML语法父文件 MyQML.qmlQML语法子文件 TLineEditV1.qmlQML语法子文件 TTextEdit.qml 效果 QML语法父文件 MyQML.qml import QtQuick 2.12 import QtQuick.Window 2.12 import QtQuick.Controls 2.12Window {id: windowvisible: truewidth: 600height: 600title:…

Linux系统进程概念详解

这里写目录标题 冯诺依曼体系结构操作系统(Operator System)1.概念2.目的3.管理4.系统调用和库函数概念 进程1.概念2.描述进程-PCB3.查看进程4.通过系统调用获取进程标示符5.通过系统调用创建进程-fork 进程状态1.Linux内核源代码2.进程状态查看 进程优先级1.基本概念2.查看系统…

投个 3D 冰壶,上班玩一玩

本篇文章将介绍如何使用物理引擎和图扑 3D 可视化技术来呈现冰壶运动的模拟。 Oimo.js 物理引擎 Oimo.js 是一个轻量级的物理引擎&#xff0c;它使用 JavaScript 语言编写&#xff0c;并且基于 OimoPhysics 引擎进行了改进和优化。Oimo.js 核心库只有 150K &#xff0c;专门用…

5G的发展过程

目录 1.什么是5G 2.5G与4G的区别 3.5G的应用领域 4.5G给人类带来的福利 5.5G未来的发展趋势 1.什么是5G 5G技术是第五代移动通信技术&#xff0c;它是对之前的2G、3G和4G技术的升级和革新。5G技术具有更高的数据传输速度、更低的延迟和更大的网络容量&#xff0c;为人们提供…