mid < target 返回的 left 是第一个大于等于 target 的位置 mid <= target 返回的 left 是第一个大于 target 的位置
两种模板写法
法一:闭区间
def binarySearch(nums:List[int], target:int) -> int:
left, right = 0, len(nums)-1
while left <= right: # 不变量:左闭右闭区间
mid = left + (right-left) //2
if nums[mid] < target:
left = mid + 1
else:
right = mid - 1
return left # 若存在target,则返回第一个等于target的值
法二:左闭右开区间
def binarySearch(nums:List[int], target:int) -> int:
left, right = 0, len(nums)-1
while left < right: # 不变量:左闭右闭区间
mid = left + (right-left) //2
if nums[mid] < target:
left = mid + 1
else:
right = mid
return left # 若存在target,则返回第一个等于target的值
def binarySearch(nums:List[int], target:int) -> int:
left, right = 0, len(nums)-1
while left <= right: # 不变量:左闭右闭区间
mid = left + (right-left) //2
if nums[mid] < target:
left = mid + 1
else:
right = mid - 1
return left # 若存在target,则返回第一个等于target的值
法二:左闭右开区间
def binarySearch(nums:List[int], target:int) -> int:
left, right = 0, len(nums)-1
while left < right: # 不变量:左闭右闭区间
mid = left + (right-left) //2
if nums[mid] < target:
left = mid + 1
else:
right = mid
return left # 若存在target,则返回第一个等于target的值
浮点数二分
l r 都返回mid就行
循环条件:l + 1e-7 <= r 比要求精度再精细一点就行
l r mid 都用浮点型
#include <bits/stdc++.h>
using namespace std;
double n;
int main() {
cin >> n;
double l = -100, r = 100;
while (l + 1e-7 <= r) {
double mid = (l + r) / 2;
if (pow(mid, 3) < n)
l = mid;
else
r = mid;
}
cout << fixed << setprecision(6) << l << endl;
}