【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}
}
完~
未经作者同意禁止转载
相关文章:

【C语言.oj刷题】有序#整型矩阵元素查找##{思路+C源码}
目录 题目信息 题目分析: 法一: 遍历二维数组(低效) 思路 源码 局限性 法二: 对每一行二分查找(有所提效) 思路 源码 局限性 法三: 利用一切有利条件使用二分查找 思路 …...

rabbitmq默认交换机锁绑定的routingkey-待研究
例如这个是我的一个消息队列,它默认绑定的交换机是 什么类型呢? 看到这个图,感觉应该是一个默认的交换机,因为是default exchange 于是来到交换机来看看其他默认的交换机: 这里可以看到默认的交换机是direct(应该没…...

【计算思维】蓝桥杯STEMA 科技素养考试真题及解析 4
1、下列哪个选项填到填到下图空缺处最合适 A、 B、 C、 D、 答案:D 2、按照如下图的规律摆放正方形,第 5 堆正方形的个数是 A、13 B、14 C、15 D、16 答案:D 3、从右面观察下面的立体图形,看到的是 A、 B、 C、 D、 答…...

基于STM32CubeMX和keil采用RTC时钟周期唤醒和闹钟实现LED与BEEP周期开关
文章目录 前言1. RTC概念1.1 RTC的时钟信号源1.2 预分频器1.3 实时时钟与日历数据1.4 周期性自动唤醒1.5 可编程闹钟 2. RTC相关中断3. STM32CubeMX配置3.1 时钟配置3.2 引脚配置3.3 RTC配置3.3.1 模式选择3.3.2 RTC基本参数配置3.3 中断配置 4. 代码编写总结 前言 RTC的功能有…...

Virtual安装centos后,xshell连接centos
1. 网络使用Host-Only模式动态分配IP,点确定后,centos 上运行 system restart network ,使用ifconfig查看新的ip,XShell可以直接连上centos, 但是由于使用的是Host-Only模式,centos不能访问网络,…...

Taro.navigateTo 使用URL传参数和目标页面参数获取
文章目录 1. Taro.navigateTo 简介2. 通过 URL 传递参数3. 目标页面参数获取4. 拓展与分析4.1 拓展4.2 URL参数的类型4.3 页面间通信 5. 总结 🎉欢迎来到Java学习路线专栏~Taro.navigateTo 使用URL传参数和目标页面参数获取 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x…...

Unity Meta Quest 一体机开发(七):配置玩家 Hand Grab 功能
文章目录 📕教程说明📕玩家物体配置 Hand Grab Interactor⭐添加 Hand Grab Interactor 物体⭐激活 Hand Grab Visual 和 Hand Grab Glow⭐更新 Best Hover Interactor Group 📕配置可抓取物体(无抓取手势)⭐刚体和碰撞…...

我又开始贩卖焦虑了,机器视觉兄弟们,打工这生意盘不活了?让人逃离北上广深,是毒鸡汤吗?
我想大多数人和我想的一样,不要质疑自己的出身,也不必用一生去改变出身而获得融入感,思想富足这是我们留给自己一生最珍贵的礼物。也许一线城市容不下肉身,二三线城市容不下灵魂。那我回到生我养我的十八线小县城,这不…...

hyperledger fabric2.4测试网络添加组织数量
!!!修改内容比较繁琐,预期未来提供模板修改 修改初始配置文件,初始添加3个组织 organizations文件夹 /cryptogen文件夹下创建文件crypto-config-org3.yaml,内容如下: PeerOrgs:# ---------------------------------------------------------------------------# Org3# ----…...

分库分表
分库,分表,分库分表 “只分库“,“只分表“,“既分库又分表" 何时分库 在面对高并发的情况下,数据库连接成为性能瓶颈。当数据QPS过高导致数据库连接数不足时,考虑分库。在读多写少的场景下&#x…...
uniapp自定义组件
在UniApp中,你可以使用自定义组件来拓展应用程序的功能和界面。自定义组件是由多个Vue组件构成的,可以在应用程序中重复使用。 要创建一个自定义组件,你需要在UniApp项目中的components目录下创建一个新的文件夹,并在该文件夹中创…...
linux gdb调试
安装gdb yum install gdb -y 查看dump文件所在路径: 可通过 cat /proc/sys/kernel/core_pattern命令获取dump目录路径 gdb调试: 可执行文件为 xxx(例如:main),结合其运行时产生的dump文件进行调试 命令&a…...
java17 linux 环境配置
linux版本 :centos 8 1.能联网的情况下: wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz 2.mkdir /usr/local/java tar zxvf jdk-17_linux-x64_bin.tar.gz -C /usr/local/java 3./etc/profile增加: export JAVA_HOME/usr/local/java/jdk-17.…...

Flutter最新稳定版3.16 新特性介绍
Flutter 3.16 默认采用 Material 3 主题,Android 平台预览 Impeller,DevTools 扩展等等 欢迎回到每季度一次的 Flutter 稳定版本发布,这次是 Flutter 3.16。这个版本将 Material 3 设为新的默认主题,为 Android 带来 Impeller 预览…...

nodejs+vue慢性胃炎健康管理系统的设计与实现-微信小程序-安卓-python-PHP-计算机毕业设计
随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于慢性胃炎健康管理系统当然也不能排除在外,随着网络技术的不断成熟,带动了慢性胃炎健康管理系统, 系统首页、个…...
【C++】传递‘类非静态成员函数’用作回调函数
在C语言中,传递函数指针是非常常见的操作。 在C语言中,使用C语言一致的方法传递全局函数指针,或者传递静态函数指针也很常见。 不过如果遇到想传递非静态成员函数时,可以参考以下示例代码。 #ifndef _WORKER_HPP_ #define _WOR…...
vscode 创建 运行c++ 项目
1 扩展 install c 2.1安装 mingw g 下载 MinGW-w64 - for 32 and 64 bit Windows - Browse Files at SourceForge.net win32下载地址 Download x86_64-8.1.0-release-win32-seh-rt_v6-rev0.7z (MinGW-w64 - for 32 and 64 bit Windows) 2.2 把 文件夹 bin 路径 添加到环境…...

Spring Cloud学习(十)【Elasticsearch搜索功能 分布式搜索引擎02】
文章目录 DSL查询文档DSL查询分类全文检索查询精准查询地理坐标查询组合查询相关性算分Function Score Query复合查询 Boolean Query 搜索结果处理排序分页高亮 RestClient查询文档快速入门match查询精确查询复合查询排序、分页、高亮 黑马旅游案例 DSL查询文档 DSL查询分类 …...

大数据HCIE成神之路之数学(3)——概率论
概率论 1.1 概率论内容介绍1.1.1 概率论介绍1.1.2 实验介绍 1.2 概率论内容实现1.2.1 均值实现1.2.2 方差实现1.2.3 标准差实现1.2.4 协方差实现1.2.5 相关系数1.2.6 二项分布实现1.2.7 泊松分布实现1.2.8 正态分布1.2.9 指数分布1.2.10 中心极限定理的验证 1.1 概率论内容介绍…...

【论文解读】FFHQ-UV:用于3D面部重建的归一化面部UV纹理数据集
【论文解读】FFHQ-UV 论文地址:https://arxiv.org/pdf/2211.13874.pdf 0. 摘要 我们提出了一个大规模的面部UV纹理数据集,其中包含超过50,000张高质量的纹理UV贴图,这些贴图具有均匀的照明、中性的表情和清洁的面部区域,这些都是…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

轻量级Docker管理工具Docker Switchboard
简介 什么是 Docker Switchboard ? Docker Switchboard 是一个轻量级的 Web 应用程序,用于管理 Docker 容器。它提供了一个干净、用户友好的界面来启动、停止和监控主机上运行的容器,使其成为本地开发、家庭实验室或小型服务器设置的理想选择…...
React父子组件通信:Props怎么用?如何从父组件向子组件传递数据?
系列回顾: 在上一篇《React核心概念:State是什么?》中,我们学习了如何使用useState让一个组件拥有自己的内部数据(State),并通过一个计数器案例,实现了组件的自我更新。这很棒&#…...

Java高级 |【实验八】springboot 使用Websocket
隶属文章:Java高级 | (二十二)Java常用类库-CSDN博客 系列文章:Java高级 | 【实验一】Springboot安装及测试 |最新-CSDN博客 Java高级 | 【实验二】Springboot 控制器类相关注解知识-CSDN博客 Java高级 | 【实验三】Springboot 静…...

人工智能学习09-变量作用域
人工智能学习概述—快手视频 人工智能学习09-变量作用域—快手视频...