二分法查找时中间值的取定


记录原因:

刷题时发现一道二分法题怎么写都超时
老天,我从开始学编程就没注意过这事啊,mid一直是用 (b+e)/2表示啊
甚至一度怀疑二分法写错了,或者根本不是用二分法做的

然后我看了正确答案

int mid=b+(e-b)/2;

将道理我好歹还比这个少一次加减法运算吧

超时的用例

索引范围:1-2126753390 (越2*10^9)
目标索引:1702766719

底层原因:

计算机采用补码表示,java int型4字节共32位:1位符号位+31位数值位
这时第一次mid取值大概10^9
第二次计算mid时(10^9+ 2126753390)会溢出,符号位变成1,结果为负数,接下来的计算就会不断循环直到超时

*想要不超可以用long,但是来回转型有点麻烦,特别是接口给的是int型
而且浪费空间