当前位置: 首页 > 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的使用
  • 0x05 Python数据分析,Anaconda八斩刀
  • 77. Combinations
  • Android框架之Volley
  • CentOS7 安装JDK
  • create-react-app做的留言板
  • Date型的使用
  • ES6系列(二)变量的解构赋值
  • HTML-表单
  • iOS小技巧之UIImagePickerController实现头像选择
  • js中forEach回调同异步问题
  • PAT A1120
  • Python学习之路13-记分
  • Rancher如何对接Ceph-RBD块存储
  • SpiderData 2019年2月23日 DApp数据排行榜
  • Vue学习第二天
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 将回调地狱按在地上摩擦的Promise
  • 试着探索高并发下的系统架构面貌
  • 跳前端坑前,先看看这个!!
  • 系统认识JavaScript正则表达式
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • ​MySQL主从复制一致性检测
  • #13 yum、编译安装与sed命令的使用
  • $(selector).each()和$.each()的区别
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (十八)SpringBoot之发送QQ邮件
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • *p++,*(p++),*++p,(*p)++区别?
  • .gitignore文件_Git:.gitignore
  • .NET HttpWebRequest、WebClient、HttpClient
  • .net/c# memcached 获取所有缓存键(keys)
  • .Net7 环境安装配置
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .NET简谈设计模式之(单件模式)
  • .NET是什么
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题
  • [ 隧道技术 ] 反弹shell的集中常见方式(二)bash反弹shell