今天打卡蓝桥杯每日一题,有关二分的题目,于是就把二分算法的代码又复盘了一下,看的是以前的模板题,get到了一些以前没get到的点,在这里做一个记录:
while (l < r)
{
int mid = l + r >> 1;
if (q[mid] >= x) r = mid;
else l = mid + 1;
}
while (l < r)
{
int mid = l + r + 1 >> 1;
if (q[mid] <= x) l = mid;
else r = mid - 1;
}
今天搞清楚了这两段代码中的q[mid] >= x和q[mid] <= x,其中=的有无会有什么影响。
这两段代码可以对应这样改:
while (l < r)
{
int mid = l + r >> 1;
if (q[mid] < x) l = mid + 1;
else r = mid;
}
while (l < r)
{
int mid = l + r + 1 >> 1;
if (q[mid] > x) r = mid - 1;
else l = mid;
}
也许可以这样理解,=的有无意味着让肯定不满足条件(找到与x相等的值)的l或r移动一位。
当然,模板记住一个就好啦~但深入理解后,对模板的记忆也更加深刻了。
对于很多模板自己都有模糊的细节~慢慢来吧~
加油,海纳百川,厚积薄发!
加油!积水成渊,蛟龙生焉