【C语言.oj刷题】有序#整型矩阵元素查找##{思路+C源码}

 

目录

 题目信息

题目分析:

法一:

遍历二维数组(低效)

思路

源码

 局限性

 法二:

对每一行二分查找(有所提效)

思路

 源码

局限性

法三:

利用一切有利条件使用二分查找

思路

源码

局限性

 二分查找源码:


 

 题目信息

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

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


题目分析:

        这道题是什么情况呢?其实就是说,有下面的这样一个满足要求的矩阵:

 

 干脆  , 更直观一点:


         也就是,在这样的矩阵(每一行从左到右递增,每一列从上到下递增)中查找一个特定的元素。

        如果找到,确定它的位置;如果找不到,输出  -1 ;

法一:

 

遍历二维数组(低效)

 

思路

        我们首先最容易想到的,也是最简单的方法,就是遍历数组,一个一个去试一试,看看能不能找到。

源码


#define ROW 5
#define COL 5int main()
{int key;scanf("%d",&key);char arr[ROW][COL] = {{1,2,3,4,5},{4,5,6,7,8},{5,6,7,8,10},{10,11,12,13,14},{15,16,17,18,19}};int i = 0;for(i = 0;i < ROW;i++){int j = 0;for(j = 0;j < COL;j++){if(key ==arr[i][j]){printf("找到了,在%d行%d列\n",i,j);break;}}}return 0;
}

 

         

         对照一下结果,代码是正确的。

 局限性

 

        经过计算,遍历算法的时间复杂度为O(N^2)

         虽然遍历算法思路简单易想,这样的时间复杂度太大,不再符合题目要求。

 法二:

 

对每一行二分查找(有所提效)

 

思路

        由于数组的每一行都是有序的,这样就满足了二分查找的使用条件,所以可以直接对每一行二分查找:

        直观一点:

 源码


#define ROW 5
#define COL 5
#include<stdio.h>
#include<string.h>
int bi_search(int arr[ROW],int sz,int key)
{int f = 0;int left = 0;int right = sz-1;int mid = (left + right)/2;while(left<=right){   mid = (left + right)/2;if(arr[mid] > key){right = mid - 1;}else if(arr[mid] < key){left = mid + 1;}else if(arr[mid] == key){f = 1;return mid;}}if(f == 0){return -1;}
}
int main()
{int key;scanf("%d",&key);int arr[ROW][COL] = {{1,2,3,4,5},{4,5,6,7,8},{5,6,7,8,10},{10,11,12,13,14},{15,16,17,18,19}};int i = 0;int f = 0;for(i = 0;i < ROW;i++){int ret = bi_search(arr[i],COL,key);if(ret != -1){f = 1;printf("找到了,在%d行%d列\n",i,ret);}}if(f == 0){printf("找不到");}return 0;
}

         在实际动手写代码时,我也遇到了一些问题,比如刚开始把打印找不到放在循环内,结果出现了这样的结果:

         这就挺尴尬的,解决办法是引入判断变量f,然后先假设找不到f初始化为0;如果找到,f置为1,如果直到循环完毕,f都没有被置为1,则就是整个数组都没有key;

局限性

        经计算,对每一行进行二分查找算法的时间复杂度为O(N log2(N))

虽然速度有所提升,但是效率仍然达不到题目要求。 

 

法三:

 

利用一切有利条件使用二分查找

 

思路

         我们可以先对行进行二分查找

        假设找9,在比9大的前一个元素前停下,由于行列都是从小到大递增的,所以可以断定后两行没有要找的元素9

 

  对行二分查找

 

 后两行没有9

 

 

 

 接下来对行进行二分查找,但是我们发现所有的行都小于要查找的key,所以接下来只能对剩下的3行分别二分查找。

 

 

 在这种n = 5 ,的情况下,我们发现时间复杂度并没有降低多少,我们分析一下:

        每一行二分,需要5次;

        而先列,进行排除;再行,需要4次;

但是在一般情况下,n可能很大,可能是100000,甚至更大,在这种情况下,程序有很大程度的提效。

 

 

 时间复杂度N的趋势:

 

源码

       我在写这个代码的时候遇到了一些问题,在对第一列进行二分查找后,在不再次遍历数组的情况下(不再增加时间复杂度),没有办法定位到合适的位置(在这个位置上,数组的后一个元素的大小大于key,数组前一个元素大小小于key,),你可以想一想,私信我交流。

局限性

         假设第k个找到合适位置,需要进行两次二分查找,时间复杂度是(log2(N)),剩下每一行都可能会出现key;

       

        但在此处,我选择对排除后的每一行进行二分查找,时间复杂度为(k*log2(k));

则时间复杂度的表达式为:

        T = log2(N)+   k*log2(k)  (k < N)

         最差情况,k == N,时间复杂度O(N* ( log2 (N) ) );

         最优解:k == 0,时间复杂度O(1);

        其实,我们可以设计更复杂的算法,这样可以进一步提高效率;

         提供一种思路:沿着对角线遍历n*n的矩阵,找到合适的停留点,这样又可以排除一部分可能:

 

         如果你可以巧妙利用题目信息,那么,即使有时间限制,oj题目对你来说一定不在话下!

         加油吧!


 

 二分查找源码:

int bi_search(int arr[ROW],int sz,int key)//参数分别是:要查找的行,数组元素的个数,要查找的对象
{int f = 0;int left = 0;int right = sz-1;int mid = (left + right)/2;while(left<=right){   mid = (left + right)/2;if(arr[mid] > key){right = mid - 1;}else if(arr[mid] < key){left = mid + 1;}else if(arr[mid] == key){f = 1;return 1;//如果找到,返回1}}if(f == 0){return -1;//如果找不到,返回-1}
}

完~

 未经作者同意禁止转载

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

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

相关文章

由两个独立的高增益运算放大器组成的运放芯片D258,可应用于音频信号处理系统上

D258是由两个独立的高增益运算放大器组成。可以是单电源工作&#xff0c;也可以是双电源工作,电源的电流消耗与电源电压大小无关。应用范围包括变频放大器、DC增益部件和所有常规运算放大电路。 主要特点&#xff1a; ● 可单电源或双电源 工作 ● 在一个封装内的两个经…

vue3项目安装eslint和prettier

【几乎最全/全网最长的 2 万 字】前端工程化完整流程&#xff1a;从头搭到尾&#xff08;vue3 vite qiankun docker tailwindcss iview......&#xff09;_前端工程化流程-CSDN博客 vue3tsvite项目中使用eslintprettierstylelinthusky指南 - 掘金 上面两篇文章相互结合操…

网络工程师网络配置经典例题(五)

1、配置SwitchA的单臂静态BFD特性 [SwitchA] bfd [SwitchA-bfd] quit [SwitchA] bfd 1 bind peer-ip 10.2.2.2 interface vlanif 10 source-ip 10.1.1.1 one-arm-echo [SwitchA-bfd-session-1] discriminator local 1 [SwitchA-bfd-session-1] min-echo-rx-interval 200 …

解决:Error: Missing binding xxxxx\node_modules\node-sass\vendor\win32-x64-83\

一、具体报错 二、报错原因 这个错误是由于缺少 node-sass 模块的绑定文件引起的。 三、导致原因 3.1、环境发生了变化 3.2、安装过程出现问题 四、解决方法步骤&#xff1a; 4.1、重新构建 node-sass 模块 npm rebuild node-sass 4.2、清除缓存并重新安装依赖 npm c…

20231117在ubuntu20.04下使用ZIP命令压缩文件夹

20231117在ubuntu20.04下使用ZIP命令压缩文件夹 2023/11/17 17:01 百度搜索&#xff1a;Ubuntu zip 压缩 https://blog.51cto.com/u_64214/7641253 Ubuntu压缩文件夹zip命令 原创 chenglei1208 2023-09-28 17:21:58博主文章分类&#xff1a;LINUX 小工具 文章标签命令行压缩包U…

Google身份验证器Google Authenticator的java服务端实现

Google身份验证器Google Authenticator是谷歌推出的一款基于时间与哈希的一次性密码算法的两步验证软件令牌&#xff0c;此软件用于Google的认证服务。此项服务所使用的算法已列于RFC 6238和RFC 4226中。谷歌验证器上的动态密码按照时间或使用次数不断动态变化&#xff08;默认…

从CentOS向KeyarchOS操作系统的wordpress应用迁移实战

文章目录 从CentOS向KeyarchOS操作系统的wordpress应用迁移实战一、使用浪潮信息X2Keyarch迁移工具完成操作系统的迁移1.1 迁移前的验证1.2 执行迁移评估1.3 开始迁移1.4 验证迁移结果1.5 迁移后的验证 二、总结 从CentOS向KeyarchOS操作系统的wordpress应用迁移实战 CentOS是一…

Element UI 偶发性图标乱码问题

1. 问题如图所示 2. 原因&#xff1a;sass版本低 sass: 1.26.8 sass-loader: 8.0.2 3. 解决方法 (1) 提高sass版本 (2) 在vue.config.js中添加配置 css: {loaderOptions: {sass: {sassOptions: {outputStyle: expanded}}}},4. 遇到的问题 升级后打包&#xff0c;报错 Syntax…

CTFhub-RCE-过滤cat

查看当前目录&#xff1a;输入:127.0.0.1|ls 127.0.0.1|cat flag_42211411527984.php 无输出内容 使用单引号绕过 127.0.0.1|cat flag_42211411527984.php|base 64 使用双引号绕过 127.0.0.1|c""at flag_42211411527984.php|base64 使用特殊变量绕过 127.0.0.…

微服务学习|Feign:快速入门、自定义配置、性能优化、最佳实践

RestTemplate方式调用存在的问题 先来看我们以前利用RestTemplate发起远程调用的代码 存在下面的问题 代码可读性差&#xff0c;编程体验不统一 参数复杂URL难以维护 Feign的介绍 Feign是一个声明式的http客户端&#xff0c;官方地址: https://github.com/OpenFeign/feign …

OpenAI 董事会与 Sam Altman 讨论重返 CEO 岗位事宜

The Verge 援引多位知情人士消息称&#xff0c;OpenAI 董事会正在与 Sam Altman 讨论他重新担任首席执行官的可能性。 有一位知情人士表示&#xff0c;Altman 对于回归公司一事的态度暧昧&#xff0c;尤其是在他没有任何提前通知的情况下被解雇后。他希望对公司的治理模式进行重…

客户管理系统大盘点!推荐这五款

客户管理系统大盘点&#xff01;推荐这五款。 客户管理系统也就是CRM&#xff0c;可以说是企业刚需&#xff0c;国内外的客户管理系统也是数不胜数&#xff0c;到底有哪些是真正好用&#xff0c;值得推荐的呢&#xff1f;本文将为大家推荐这5款好用的客户管理系统&#xff1a;…

SQLserver-快速复制一行数据到数据库并修改ID

右击表名&#xff0c;点击选择前1000行 在前面写插入到哪个表&#xff0c;并且对唯一标识字段进行重写 后面是筛选&#xff0c;具体复制哪条数据

从工业互联走向工业AI,国产工业操作系统的机遇和使命

随着科技的飞速发展&#xff0c;工业领域正在经历一场由工业互联网&#xff08;IndustrialInternet&#xff09;到工业AI&#xff08;ArtificialIntelligence&#xff09;的革命性变革。 民用互联网顾名思义即实现人与互联网的连接&#xff0c;服务于人民生活的方方面面。自19…

Springcloud可视化物联网智慧工地云SaaS平台源码 支持二开和私有化部署

智慧工地平台围绕建筑施工人、物、事的安全管理为核心&#xff0c;对应研发了劳务实名制、视频监控、扬尘监测、起重机械安全监测、安全帽监测等功能一体化管理的解决方案。 智慧工地是聚焦工程施工现场&#xff0c;紧紧围绕人、机、料、法、环等关键要素&#xff0c;综合运用物…

802.11ax-2021协议学习__$27-HE-PHY__$27.5-Parameters-for-HE-MCSs

802.11ax-2021协议学习__$27-HE-PHY__$27.5-Parameters-for-HE-MCSs 27.3.7 Modulation and coding scheme (HE-MCSs)27.3.8 HE-SIG-B modulation and coding schemes (HE-SIG-B-MCSs)27.5 Parameters for HE-MCSs27.5.1 General27.5.2 HE-MCSs for 26-tone RU27.5.3 HE-MCSs f…

7 进制数字转换

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/base-7/description/ 给定一个整…

图像处理01 小波变换

一.为什么需要离散小波变换 连续小波分解&#xff0c;通过改变分析窗口大小&#xff0c;在时域上移动窗口和基信号相乘&#xff0c;最后在全时域上整合。通过离散化连续小波分解可以得到伪离散小波分解&#xff0c; 这种离散化带有大量冗余信息且计算成本较高。 小波变换的公…

如何写好一篇软文?怎样写软文比较有吸引力?

软文&#xff0c;即柔性广告&#xff0c;是一种通过文字、图片等形式&#xff0c;将广告信息融入到内容中&#xff0c;以达到宣传、推广、营销目的的文章。企业和品牌每天都会在互联网上投放大量软文&#xff0c;软文起到润物细无声的作用&#xff0c;可以在无形中影响用户心智…

v-if与v-show

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容:v-if与v-show 目录 v-if与v-show区别 一、v-show与v-if的共同点 二、v-show与v-if的区别 三、v…