最近做到有二分的题目,发现对二分边界的地方的处理理解的很模糊。这里来总结一下二分的几种边界处理情况:
1、求最大值的最小值问题
这种问题最后的取值为左端点。代码如下:
while(left < right){
int mid = (left+right)>>1;
if(mid > key){
right = mid;
}else{
left = mid + 1;
}
}
//最后取值为左端点的值
int res = left;
2、求最小值的最大值问题
这种问题最后取值为右端点,且需要向上取整,代码如下:
while(left < right){
int mid = (left+right+1)>>1;
if(mid < key){
left = mid;
}else{
right = mid - 1;
}
}
//最后取值为右端点
int res = right;
总结:
最后要求的是区间的最小值,则向下取整;如果要求的是区间的最大值,则向上取整。
如果向下取整,则left = mid+1。如果向上取整,则right=mid-1
记住板子中else后边部分都是需要加1或者减1的。