二分查找模板:
①整数二分:
模板一:
def Binary_Search(res,data):
'''
在res中查找值为data的元素(可用于查找元素在数组中第一次出现的位置)
'''
left=0
right=len(res)-1
while left<right:
mid=left+right>>1
if (check(res[mid])):right=mid
else:left=mid+1
return left
模板二:
def Binary_Search(res,data):
'''
在res中查找值为data的元素(可用于查找元素在数组中最后一次出现的位置)
'''
left=0
right=len(res)-1
while left<right:
mid=left+right+1>>1
if (check(res[mid])):left=mid
else:right=mid-1
return left
例子:
数的范围:查找一个数字在一个有序数组中出现第一次的位置和出现最后一次的位置。如果都没出现过就返回-1,-1。
def Binary_Search(res,data):
'''
在res中查找data第一次出现的位置和最后一次出现的位置
'''
left=0
right=len(res)-1
while left<right:
mid=left+right>>1
if res[mid]>=data:
right=mid
else:
left=mid+1
if res[left]!=data:#没有找到
return [-1,-1]
else:
l_n=left#记录第一次出现的位置
#再来一次二分
left=0
right=len(res)-1
while left<right:
mid=left+right+1>>1
if res[mid]<=data:
left=mid
else:
right=mid-1
return [l_n,left]
②浮点数二分(C++):
不需要考虑边界问题。
bool check(double x) {/* ... */} // 检查x是否满足某种性质
double bsearch_3(double l, double r)
{
const double eps = 1e-6; // eps 表示精度,取决于题目对精度的要求
while (r - l > eps)
{
double mid = (l + r) / 2;
if (check(mid)) r = mid;
else l = mid;
}
return l;
}