看了下知乎上关于二分的问题,二分有几种写法,有什么区别
果然一千个人有一千种哈姆雷特。。。
不断重复也是学习,虽然可能效率不高。
1.非下降序列
1.1 下界
当v存在时,返回它出现的第一个位置。如若不存在,返回这样一个下标i(在此处插入v后,序列依旧有序)。
int bsea(int n, ll v){
int m;
int x = 0, y = n;
while(x<y){
m = x + (y-x)/2;
if(q[m]>=v) y = m; // 换成条件即可
else x = m + 1;
}
return x;
}
1.2 上界
当v存在时返回它出现的最后一个位置的后面。
如若不存在返回这样一个下标(在此处插入v后序列依然有序)。
int bsea(int n, ll v){
int m;
int x = 0, y = n;
while(x<y){
m = x + (y-x)/2;
if(q[m]<=v) x = m+1;
else y = m;
}
return x;
}
由上可得出其实二分查找上、下界的写法只是在满足条件情况下先改变谁有区别。
上界: 若满足条件,需要选择那个大的。所以应该更新左端点。也就是先动x。
下界:与上界相反。