二分的写法

本来觉得二分没有什么,真正的去写代码才发现它的奇妙

整数上的二分

求解下限

while (l < r){
	//mid表示下限 
	int mid = (l + r + 1) / 2;
	if (valid(mid))
		l = mid;
	else
		r = mid - 1;
}

1、l = mid和r = mid - 1
①当mid满足条件时,因为mid可能是正确答案,所以令 l = mid
②当mid不满足条件时,因为mid不可能是正确答案,所以令r = mid - 1

2、mid = (l + r + 1) / 2

如果采用mid = (l + r) / 2的形式,当l + 1 = r时,有mid = (l + r) / 2 = l
①此时若进入l = mid分支,则 l 仍等于 l ,会进入死循环
②此时若进入r = mid - 1分支,则r = l - 1,不是以 l = r的形式结束

如果采用mid = (l + r + 1) / 2的形式,当r - l = 1时,有mid = (l + r + 1) / 2 = r
①此时若进入l = mid分支,则l = r,以l = r的形式结束
②此时若进入r = mid - 1的形式,则r = l,以l = r的形式结束

求解上限

while (l < r){
	//mid表示上限 
	int mid = (l + r) / 2;
	if (valid(mid))
		r = mid;
	else
		l = mid + 1;
}

1、mid = (l + r) / 2

当l + 1 = r时,mid = (l + r) / 2 = l
①此时若进入r = mid分值,则r = l,以l = r的形式结束
②此时若进入l = mid + 1分支,则l = r,以l = r的形式结束

实数上的二分

while (l + eps < r){
	double mid = (l + r) / 2;
	if (valid(mid))
		r = mid;
	else
		l = mid;
}

根据具体情况判断是改变 l 还是改变 r

发布了221 篇原创文章 · 获赞 38 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_43772166/article/details/105307762