当前位置:网站首页>二分查找法
二分查找法
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题目参考
边栏推荐
- OpenGL drawing simple triangles
- js函数调用下载文件链接
- Websocket 协议解读-RFC6455
- Sentinel 流量控制快速入门
- How to build a node development environment efficiently
- Record AP and map calculation examples
- The optimal time to buy and sell stocks includes the freezing period (leetcode-309)
- 分布式事务处理方案大 PK!
- Application of for loop
- Sentinel 三种流控模式
猜你喜欢

Dynamic planning: robbing families and houses

757. Set the intersection size to at least 2: greedy application question

IEPE vibration sensor synchronous signal acquisition card /icp synchronous data network acquisition module

Ribbon's loadbalancerclient, zoneawareloadbalancer and zoneavoidancerule are three musketeers by default

563页(30万字)智慧化工园区(一期)总体设计方案
![[electronic device note 3] capacitance parameters and type selection](/img/d2/1ddb309a8f3cfe5f65c71964052006.png)
[electronic device note 3] capacitance parameters and type selection

谷歌联合高校研发通用模型ProteoGAN,可设计生成具有新功能的蛋白质

Sentinel 三种流控效果

PC博物馆(2) 1972年 HP-9830A

Curse of knowledge
随机推荐
给你的网站加一个爱发电角标
Rust tokio:: task:: localset running mode
Try the video for 5 minutes [easy to understand]
二叉树、二叉树排序树的实现及遍历
机器学习小试(11)验证码识别测试-使用Qt与Tensorflow2进行深度学习实验
OSPF含特殊区域实验,MGRE构建和重发布
Zoj1137+ operation 1 -- May 28, 2022
Record AP and map calculation examples
The best time to buy and sell stocks Ⅲ (leetcode-123)
[correcting Hongming] what? I forgot to take the "math required course"!
Erlang learning 02
脚手架文件目录说明、文件暴露
Sentinel 流量控制快速入门
[electronic device note 3] capacitance parameters and type selection
ES6 question
Basic SQL operations
MySQL 数据库 JDBC编程
MySQL - 全文索引
PC博物馆(1) 1970年 Datapoint 2000
Ribbon's loadbalancerclient, zoneawareloadbalancer and zoneavoidancerule are three musketeers by default