Appearance
二分查找小感悟
很多二分法的教学都在讲“左闭右开”,“左闭右闭”区间,但是都没有说明为什么一定要划分这样一个开闭区间 前前后后写了很多次二分,有些感悟 二分的一个关键步骤是mid=(start+end)/2, 仅这一步就有很多坑,甚至后续的很多坑也是由这一步带来的
- 是否会溢出?所以衍生出来了
start+(end-start)/2这样的写法;一些语言甚至start+((end-start)>>1) - 由于1这样的除完结果肯定是整数的限制,会舍去小数位,也就是向左边界靠拢,在只有两个数的情况下,如果左边界不动,会陷入无限循环,因此无论何时,左边界都要+1
- 由2可知,左边界一直是闭区间,只有右边界在讨论开闭
- 由2和3可知,右区间如果是开的,即
while(left<right),在任何情况下,right的值都不可能被mid取到,所以每次迭代mid=right,反而mid=right-1会产生问题,因为无法确定right-1是不是target;如果是闭的,即while(left<=right),right是会可能等于target的,mid=right-1是安全的,反而mid=right会因为2中的情况陷入无限循环中 - 由4又可知,当数组中只有一个元素时,左闭右开的情况处理不了,压根进不去循环,还需要单独对一个元素的情况判断,所以反而是左闭右闭更通用一些。且题中元素至少一个,如果是0个时还需要单独判断