常见的acwing,代码源上的二分的模板是模板一以及模板二:
但是模板一二有时候不利于解决一些问题
查找左边界:
代码终止的条件是l == r,所以说答案是l或者r
int l = 0,r = n;
while(l < r){
int mid = (l + r + 1) >> 1;
if(a[mid] <= x) l = mid;
else r = mid - 1;
}
查找右边界:
代码终止的条件是l == r,所以答案是l或者r
int l = 0,r = n;
while(l < r){
int mid = (l + r) >> 1;
if(a[mid] <= x) r = mid;
else l = mid + 1;
}
两外两中模板的代表特点就是l <= r
查找左边界:
问题背景一:
给定一个包含重复元素的排序数组 arrarrarr,请查找 targettargettarget 在数组中的左边界:arr=[1,2,3,3,3,4,6,]arr = [1,2,3,3,3,4,6,]arr=[1,2,3,3,3,4,6,] ,target=3target = 3target=3 ,结果应该返回 222,如果不存在,请返回 −1-1−1。
模板
int index = -1;
int l = 0,r = n;
while(l <= r){
int mid = l + ((r - l) >> 1);
if(a[mid] >= x) {
index = mid;
r = mid - 1;
}
else{
l = mid + 1;
}
}
if(index == -1){
cout << "no find" << endl;
}
else{
cout << index << endl;
}
查找右边界:
问题背景:
给定一个包含重复元素的排序数组 arrarrarr,请查找 targettargettarget 在数组中的右边界:arr=[1,2,3,3,3,4,6,]arr = [1,2,3,3,3,4,6,]arr=[1,2,3,3,3,4,6,] ,target=3target = 3target=3 ,结果应该返回 444,如果不存在,请返回 −1-1−1。
模板:
int index = -1;
int l = 0,r = n;
while(l <= r){
int mid = l + ((r - l) >> 1);
if(a[mid] <= x) {
index = mid;
l = mid + 1;
}
else{
r = mid - 1;
}
}
if(index == -1){
cout << "no find" << endl;
}
else{
cout << index << endl;
}