Java面试系列-算法-二分查找中mid内存溢出问题

134 阅读1分钟

概念

Java Integer的取值范围是:

Integer类取值和int类型取值一致,取值范围是从 -21474836482147483647

溢出说明

二分查找中通常使用查找mid的计算方式

  • 1.直接left和right相加计算,会造成数值越界
int mid = (left + right) / 2;
  • 2.采用left加 (right - left)/ 2
int mid = left + (right - left) / 2;

数学数轴思想演示

image.png

图中第二条线段标记时,10+6会超过线段总长度限制,反应到程序中则会计算错误。

代码演示

int left = Integer.MAX_VALUE;//2147483647
int right = Integer.MAX_VALUE;//2147483647

System.out.println((left + right)/2); //输出: -1
System.out.println((l + (right - left) / 2));

思考

为什么程序中整数会有最大值?