以前刚开始学二分的时候,只知道二分就是一半一半的分下去,对于边界问题一直都不是很懂,之前为了避免这问题想着用一个对拍程序来查看自己写的是否是对的,但是想了想还是要想一个正解。
二分时主要是防止l和r的值都不发生改变,使得程序进入了死循环。
接下来是本人的一点理解。
if(mid<=x) l=mid;//如果mid<=x,那么最优解一定不在左区间
else r=mid-1;//如果mid>x,那么x即其右区间都无解
//为防止mid取到l或r时死循环
mid=(l+r+1)>>1;//取不到l,防止l=mid时死循环
if(mid<=x) r=mid;//如果mid>=x,那么最优解一定不在右区间
else l=mid+1;//如果mia<x,那么x即其左区间无解
//为防止mid取到l或r时死循环
mid=(l+r)>>1;//取不到r,防止r=mid时陷入死循环
不用考虑死循环的情况,主要需要考虑精度问题。
只适用于有单调性的函数,如$y=x^2$类似的二次函数,通过三分确定趋势,从而确定最终极值。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。