当前位置:网站首页>二分查找法
二分查找法
2022-07-24 10:28:00 【认真编程的紫衫龙王】
引言.
题目的前提是数组为有序数组,同时题目还强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的,这些都是使用二分法的前提条件,当大家看到题目描述满足如上条件的时候,可要想一想是不是可以用二分法了。二分查找涉及的很多的边界条件,逻辑比较简单,但就是写不好。例如到底是 while(left < right) 还是 while(left <= right),到底是right = middle呢,还是要right = middle - 1呢?大家写二分法经常写乱,主要是因为对区间的定义没有想清楚,区间的定义就是不变量。要在二分查找的过程中,保持不变量,就是在while寻找中每一次边界的处理都要坚持根据区间的定义来操作,这就是循环不变量规则。
一.确定区间—左闭右闭or左闭右开
坚持循环不变量,保持区间规则一致
二.具体情况分析
1.左闭右闭二分查找
left=0
right=len(nums)-1
while (left <= right):
middle = (left + right) //2
if (nums[middle] > target):
right=middle-1
elif (nums[middle] < target):
left=middle+1
else:
return middle
return -12.左闭右开二分查找
left=0
right=len(nums)-1
while (left < right):
middle = (left + right) //2
if (nums[middle] > target):
right=middle
elif (nums[middle] < target):
left=middle+1
else:
return middle
return -13.左开右闭二分查找
left=0
right=len(nums)-1
while (left < right):
middle = (left + right) //2
if (nums[middle] > target):
right=middle-1
elif (nums[middle] < target):
left=middle
else:
return middle
return -14.左开右开二分查找
left=0
right=len(nums)-1
while (left <= right):
middle = (left + right) //2
if (nums[middle] > target):
right=middle
elif (nums[middle] < target):
left=middle
else:
return middle
return -1三.总结
不论哪种形式的二分查找,其代码整体结构是相同的;区别在于区间边界的开闭情况
left=0
right=len(nums)-1
while (left <=/< right): # 当边界能取相同值时<=;否则就是<
middle = (left + right) //2
if (nums[middle] > target):
right=middle/middle-1 # 开区间是middle,闭区间是middle-1
elif (nums[middle] < target):
left=middle/middle+1 # 开区间是middle,闭区间是middle+1
else:
return middle
return -1四.Leetcode题目参考
边栏推荐
- Zoj1137+ operation 1 -- May 28, 2022
- Pytorch common tricks summary
- A ten thousand word blog post takes you into the pit. Reptiles are a dead end [ten thousand word pictures]
- 2022: I feel like sleeping for the first time during the day
- Will not be rejected! Learn the distributed architecture notes sorted out by Alibaba Daniel in 35 days, with a salary increase of 20K
- How does ribbon get the default zoneawareloadbalancer?
- binlog、iptables防止nmap扫描、xtrabackup全量+增量备份以及redlog和binlog两者的关系
- Query about operating system security patch information
- Erlang learning 02
- Arduino + AD9833 波形发生器
猜你喜欢

WEB安全基础 - - -文件上传(文件上传绕过)

OSPF含特殊区域实验,MGRE构建和重发布
![[correcting Hongming] what? I forgot to take the](/img/41/c8fa6380ab63949ae6d904fdbb005c.png)
[correcting Hongming] what? I forgot to take the "math required course"!

差分约束系统---1且2--2022年5月27日

MySQL - lock

Create a vertical seekbar from scratch

MySQL - 索引的隐藏和删除

NIO知识点

How does ribbon get the default zoneawareloadbalancer?

Association Rules -- July 10, 2022
随机推荐
机器学习小试(11)验证码识别测试-使用Qt与Tensorflow2进行深度学习实验
第五章 修改实现(IMPL)类
JS function call download file link
Sub query of multi table query_ Single row and single column
脚手架文件目录说明、文件暴露
OSPF含特殊区域实验,MGRE构建和重发布
MySQL - 多列索引
MySQL - 删除数据库表中的数据
分布式事务处理方案大 PK!
Balance between management / business and technology
分布式锁-Redission 原理分析
谷歌联合高校研发通用模型ProteoGAN,可设计生成具有新功能的蛋白质
Kotlin advanced
[electronic device note 3] capacitance parameters and type selection
Is it safe to open an online stock account?
Ribbon's loadbalancerclient, zoneawareloadbalancer and zoneavoidancerule are three musketeers by default
协议圣经-谈端口和四元组
Erlang学习01
Sentinel three flow control effects
MySQL - 索引的隐藏和删除