当前位置:网站首页>关于二分法
关于二分法
2022-07-22 10:55:00 【yizhi_hao】
二分法中点的取法
参考博文:二分以及编程过程中求中点各种写法思想解析以及完美写法
从我大学学习二分时,一直习惯将二分法中点取法写为mid = (l + r) / 2,最近开始做LeetCode题目,发现二分法求区间中点的写法更多是mid = l + (r - l) / 2,在化简后可以发现这两种实际在数学上是等价,这两种方式的差异或者说后者的优势在哪?
mid = (l + r) / 2的劣势
- 溢出问题
l + r可能会溢出int的最大范围,而l + (r - l) / 2不会,这里用减法替代了加法 - 上下界不统一
区间[2, 5]的中点求下界是mid = (2 + 5) / 2 = 3,是没问题的;而区间[-5, 2]的中点求下界是mid = (-5 + 2) / 2 = -1,这里就出现问题了,[-5, 2]求下界是-2。而(l + r) / 2求出来是-1,也就是说(l + r) / 2想要正确求出区间中点的上下界就要针对(l + r)的正负做不同的处理。而用mid = l + (r - l) / 2就不会出现上述问题。
mid = l + (r - l) / 2的优势
后者的优势就是前者的劣势。
- 不会溢出
减法替代了加法,避免大数直接相加 - 上下界求法统一
下界:mid = l + (r - l) / 2
上界:mid = l + (r - l + 1) / 2
二分法的三种典型写法
以下内容转载自:二分法的三种写法
一、有序不重复的数组
比如在数组{1,3,6,9,13}中,查找9这个元素出现的索引位置,如果不存在返回-1
public int find1(int[] nums, int k) {
int left = 0, right = nums.length - 1;
while(left <= right){
int mid = left + (right - left) / 2;
if(nums[mid] == k){
return mid;
}else if(nums[mid] > k){
right = mid - 1;
}else{
left = mid + 1;
}
}
return -1;
}
二、有重复元素,并查找第一次出现的索引
比如数组{1,3,3,6,9,13}中,查找3第一次出现的位置索引,不存在返回-1
public int find2(int[] nums, int k) {
int left = 0, right = nums.length - 1;
while(left <= right){
int mid = left + (right - left) / 2;
if(nums[mid] >= k){
right = mid - 1;
}else{
left = mid + 1;
}
}
if(left <= nums.length - 1 && nums[left] == k){
return left;
}
return -1;
}
三、有重复元素,并查找最后一次出现的索引
比如数组{1,3,3,6,9,13}中,查找3第一次出现的位置索引,不存在返回-1
public int find2(int[] nums, int k) {
int left = 0, right = nums.length - 1;
while(left <= right){
int mid = left + (right - left) / 2;
if(nums[mid] >= k){
right = mid - 1;
}else{
left = mid + 1;
}
}
if(left <= nums.length - 1 && nums[left] == k){
return left;
}
return -1;
}
边栏推荐
猜你喜欢
BUUCTF闯关日记03--[极客大挑战 2019]Havefun1
Redis 系列11--Redis 持久化
Rapid construction of selenium testing framework (UI automated testing)
Buuctf breakthrough diary -- [netding cup 2020 Qinglong group]areuserialz
Django中使用Mysql数据库
第六章:easyCode代码生成器
BUUCTF闖關日記--[網鼎杯 2020 青龍組]AreUSerialz
Using simple JS to realize arc layout
application&富文本编辑器&文件上传
Multithread 01 -- create thread and thread state
随机推荐
[LTTng实操]------设计一套东西监控某周期运行用户程序的执行时间和周期--需求分析和方案设计
BUUCTF闯关日记04--[ACTF2020 新生赛]Include1
树结构
[LTTng学习之旅]------开始之前
Chapter 2: configure data sources, redis, security, swagger and other tools jar for the project
微信小程序综合案例实践2
多线程02--顺序执行和停止线程
ETL process
微信小程序入门教程学习笔记
使用js写个3d banner
BUUCTF闯关日记--[网鼎杯 2020 青龙组]AreUSerialz
xshell、CRT上使用vbscript更高效连接定位到服务器以及目录、数据库
Bash变量--用户自定义变量
MySQL connection query using Convert in on causes the number of scan lines to increase
JMeter performance test
Use VBScript on xshell and CRT to connect and locate servers, directories and databases more efficiently
给table的td设置了 colspan 失效
动态规划入门
(7) Vulhub column: log4j Remote Code Execution Vulnerability recurrence
Multithreading 04 -- atomicity of threads, CAS