二分法的两种模版如下:
while (l < r)
{
int mid = l + r >> 1; //(l+r)/2
if (check(mid)) r = mid; // check()判断mid是否满足性质
else l = mid + 1;
}
while (l < r)
{
int mid = l + r + 1 >> 1; //(l+r+1)/2
if (check(mid)) l = mid;
else r = mid - 1;
}
两种模版都能对在数据中找到目标值,但是针对不同的情况两种方法有一些区别。
1.数据中存在多个目标值,例如在1,3,3,4这个数据中寻找3,第一个模版会寻找第一个3,而第二个则是寻找的第二个3。
2.数据中不存在目标值时,例如在513,567,598,689中寻找600,此时是无法再数据中找到600的,最终第一个模版会返回该数据大于600且离600最近的值,也就是689,而第二个模版会返回该数据中小于600且离600最近的值,也就是598。