二分查找是一种很常用的算法,记住一个优雅写法的模板能够让我们更便利刷题。在花花的视频里看到了这种写法,感觉很好用,记录一下
这种写法针对的搜索区间是左闭右开的[l, r)
,输入搜索的条件,找到第一个满足此条件的下标,如果没有找到的话,则会返回r
auto binary_search = [&](int l, int r, function<bool (int)> cond) {
while (l < r) {
int m = l + (r - l) / 2;
if (cond(m)) r = m;
else l = m + 1;
}
return l;
};
// 用法示例
int p = binary_search(0, n - 1, [&](int i) -> bool {
return v[i] > v[i+1]; // 在[0,n-1)里找第一个满足此条件的index
});
但是,这种写法是有一定的局限性的,仔细观察判断条件可知,如果符合cond
,则向左继续查找,否则向右查找
对于[5, 7, 8, 9]
,如果cond
是return nums[i] < 6;
则不会返回正确的数值,这和数组的升降序有关
简而言之,对于升序,一般使用>
或>=
查询;降序则是<
或<=
;且查询条件不能是==
原视频如下: