代码风格这里不细说喽。今天最大的收获就是二分算法!
首先,二分算法中最重要的一点就是去找那个cheak函数,也就是判断下一个边界怎么变化的条件。按照yxc总结的模板来说
算法思路:假设目标值在闭区间[l, r]中, 每次将区间长度缩小一半,当l = r时,我们就找到了目标值。
int bsearch_1(int l, int r)
{
while (l < r)
{
int mid = l + r >> 1;//移位操作,相当于除2下取整
if (check(mid)) r = mid;
else l = mid + 1;
}
return l;
}
int bsearch_2(int l, int r)
{
while (l < r)
{
int mid = l + r + 1 >> 1;//移位操作,相当于除2下取整
if (check(mid)) l = mid;
else r = mid - 1;
}
return l;
}
以上是两种不同的二分算法的模板,具体使用哪一种主要看中点值的选取:
中点mid属于左半区间,则左半区间是[l, mid],右半区间是[mid+1, r],更新方式是r = mid;或者 l = mid + 1;,此时用第一个模板;
中点mid属于右半区间,则左半区间是[l, mid-1],右半区间是[mid, r],更新方式是r = mid - 1;或者 l = mid;,此时用第二个模板;