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

【剑斩OFFER】算法的暴力美学——二分查找

一、题目描述

二、算法原理

从题目的要求我们可以看出这道题是有二段性的性质的,所谓的二段性:在一段区间内根据数据的规律可以把这个区间分为两个区间;所以我们使用二分查找算法来解决这道题:

先把这段数组的加标的中间下标求出来,然后我们就的到这样的规律:
①当 nums[ mid ]  > target 时,【mid,right】区间内的数字都不可能等于 target,只有在 【left,mid】区间内的数字有可能等于 target,所以我们让 right = mid - 1 ,到新的 【left,right】来找:

②当 nums[ mid ]  < target 时,【mid,right】区间才有可能找到target;所以:left = mid + 1,到新的 【left,right】来找:

③nums[ mid ] == target时,直接返回:mid。

然后不断循环上面的①②③来找到正确答案。

细节:

循环结束的条件:当我们不断二分时有可能 left 和 right 指向同一个数,我们还要判断一下这个数是不是符合条件的数,所以我们循环的条件是:left <= right ,当 left > right  时就结束循环。

事件复杂度:

假设数组里面的数字有  n 个:

1次二分:n/2

第二次二分:n/4 

第三次二分:n/8

...........

第x次二分:n/(2^x);此时不断的二分导致这个数接近 1,所以:1 = n/(2^x) -> 2^x = n

所以时间复杂度为:O(logn)

求mid的值的方法:

①int mid = ( left+ right)/ 2,当数据量过大时 left + right 有可能超过 int 的最大值造成数据溢出,不推荐这种方法。

实例这种方法是否能求出数组下标的中间下标:

当:left = 1 , right = 4,(left + right )/ 2 = 2,当left + right 是一个奇数时求出的mid偏小:5/2 = 2.5 = 2。

当:left  = 2,right = 4 ,(left + right)/2 = 3,当 right + left 是一个偶数是球场的数是正确的mid。

注意:求的是数组的left 和 right下标的中间下标

②int mid = left + (right - left ) / 2,这种方法推荐,防止数据溢出。

问题:为什么是二分不能是三分、四分呢?

答:因为根据数学期望得出的二分是效率最高的。

三、朴素二分模板

while(left <= right){int mid =left + (right - left)/2;if(.......) ...........;else if(..........) ............;else return .........;}
注:.....是根据每道题目的二段性来填写

四、代码实现

class Solution {
public:int search(vector<int>& nums, int target) {int left = 0,right = nums.size()-1;while(left <= right){int mid =left + (right - left)/2;if(nums[mid] > target) right = mid - 1;else if(nums[mid] < target) left = mid + 1;else return mid;}return -1;}
};

http://www.dtcms.com/a/582100.html

相关文章:

  • 找人做个网站大概多少钱做一款什么网站赚钱
  • 一个网站是如何建设中国十大seo公司
  • Java_HashMap底层机制与原码解读
  • 【ComfyUI】Wan2.2 CharacterMotion 单图角色关键词驱动视频生成
  • 网站学习流程北京朝阳区邮编
  • 河北响应式网站建设哪家有珠海编程培训机构
  • TypeScript核心类型系统完全指南
  • 做跨境电商,怎么用Facebook如何快速测品
  • 【ZeroRange WebRTC】RTP/SRTP 在 WebRTC 中的角色与工作原理(深入指南)
  • 做网站图注意事项买完域名接下来怎么弄
  • 襄阳做网站公司哪家好wordpress json 插件安装
  • 异常的回声——C++异常机制的堆栈回滚与性能真相
  • 【AI】人类思维方式
  • 公众号微信网站开发网站免费模版代码
  • 解决Unsupported characters for the charset ‘ISO-8859-1‘
  • 机器学习在供水管网阀门管理中的应用
  • React Native (RN)项目在web、Android和IOS上运行
  • 【信息安全毕业设计】基于zkSNARK与递归证明的数字签名验证方案研究
  • 研0不会总结文献核心科学问题?
  • pyside6常用控件: QProgressBar() 进度条显示
  • H5 移动端调试全流程指南,从浏览器模拟到真机 WebView 调试的完整实践
  • a4网站建设网站建站多少钱
  • 整合多平台消息:使用n8n的HTTP请求节点创建智能通知中心
  • 基于SpringBoot的动漫周边商场系统的设计与开发
  • e福州官方网站wordpress后台登陆很慢
  • 做影视网站犯法吗一图读懂制作网站
  • android compose flow retrofit mViewModel Hilt 天气预报的demo可以直接以此为框架
  • 文件 Java IO 操作:文件读取、写入与管理!
  • 建设移动网站城乡互动联盟网站建设
  • 2026助力发刊:深度学习超导材料与量子器件专题学习