当前位置: 首页 > news >正文

(C语言)二分查找 超详细

📌 博客主页   爆打维c

目录

一、二分查找的原理

1.优点

2.缺陷

3.原理(核心思想)

4.例题

描述

思路:


一、二分查找的原理

在讲原理之前,先为大家分析一下二分查找的优缺点。

1.优点

如果我们要在数组里面找一个元素的位置,虽然遍历可以暴力解决,但是二分查找的效率更高

遍历的时间复杂度O(n)

二分查找的时间复杂度O(logn)

2.缺陷

通常情况下,二分查找只适用于有序的数组(升序或降序),如果一个数组是无序的,那么就不能使用二分查找的办法找到一个元素的位置。且查找的数量只能是一个。

3.原理(核心思想)

分治分治即“分而治之”,“分”指的是将一个大而复杂的问题划分成多个性质相同但是规模更小的子问题,子问题继续按照这样划分,直到问题可以被轻易解决;“治”指的是将子问题单独进行处理。经过分治后的子问题,需要将解进行合并才能得到原问题的解,因此整个分治过程经常用递归来实现。

二分查找二分左右界从而找到元素的位置,

4.例题

描述

给定一个长度为 n 的非降序数组和一个非负数整数 k ,要求统计 k 在数组中出现的次数
要求:空间复杂度 O(1),时间复杂度O(logn)

数据范围:0 ≤ n ≤ 1000,0 ≤ k ≤ 100,数组中每个元素的值满足 0 ≤ val ≤ 100

知识点:数组,二分查找

示例1

输入:

[1,2,3,3,3,3,4,5],3

返回值:

4

思路:

因为该数组是非降序数组(即升序数组),这时候我们很容易就想到用二分查找的方法,但是一个数组可能有多个k,而且我们要查找的并非常规二分法中k出现的位置,而是k出现的左界和k出现的右界。要是能刚好找到恰好小于k的数字位置和恰好大于k的数字的位置就好了。

因为数组中全是整数,因此我们可以考虑,用二分查找找到k+0.5应该出现的位置和k−0.5应该出现的位置,二者相减就是k出现的次数。

🎃步骤1:写一个二分查找的函数找到元素在数组中出现的位置,每次检查区间中点值,根据与中点的大小比较,确定下一次的区间。

🎃步骤2:找出 k+0.5出现的位置 和 k−0.5出现的位置 然后二者相减。

#include<stdio.h>
int SearchPos(int* nums, int numsLen,float n) {int left = 0, right = numsLen - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] > n) {right = mid - 1;}if (nums[mid] < n) {left = mid + 1;}return left;}
}
int GetNumberOfK(int* nums, int numsLen, int k) {// write code herereturn SearchPos(nums, numsLen, k +0.5) - SearchPos(nums, numsLen, k - 0.5);}
int main(){int arr[5] = { 1,2,2,2,3 };int k=GetNumberOfK(arr, 5, 2);printf("%d", k);return 0;
}

今天的内容到这里就结束了,喜欢的话给博主一个赞鼓励一下吧🥳

相关文章:

  • 51-27 DirveVLM:自动驾驶与大型视觉语言模型的融合
  • nodejs安装教程(及过程中的易错)
  • API协议设计的十种技术
  • OpenHarmony教程指南—Ability的启动模式
  • C# 使用DocX生成word文档
  • 使用Python改变图片像素
  • 使用Python制作自己的wheel文件
  • [赛码网、牛客刷题、ACM模式] python读取输入
  • MyBatis操作数据库(SQL注入)
  • Autosar教程-Mcal教程-GPT配置教程
  • LayerNorm的图是不是画错了
  • 先缓存第二集抖音接入 ,最近加班猛,就分享简单的知识,如何使用:关于使用replace的用法正则表达式
  • Redis场景总结
  • Java算法之动态规划
  • 集合拆分Lists.partition的使用
  • hexo+github搭建个人博客
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • Angular6错误 Service: No provider for Renderer2
  • Effective Java 笔记(一)
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • js写一个简单的选项卡
  • Laravel 菜鸟晋级之路
  • PV统计优化设计
  • Python实现BT种子转化为磁力链接【实战】
  • spring boot下thymeleaf全局静态变量配置
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 聊聊redis的数据结构的应用
  • 前端设计模式
  • 携程小程序初体验
  • 新手搭建网站的主要流程
  • 学习HTTP相关知识笔记
  • 一道闭包题引发的思考
  • 译有关态射的一切
  • hi-nginx-1.3.4编译安装
  • MyCAT水平分库
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​VRRP 虚拟路由冗余协议(华为)
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • $L^p$ 调和函数恒为零
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (C++20) consteval立即函数
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (译)计算距离、方位和更多经纬度之间的点
  • (转)负载均衡,回话保持,cookie
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例